3 回答
TA貢獻1828條經驗 獲得超4個贊
在幾乎所有情況下,您的語義都應該是:
bar(foo f); // want to obtain a copy of f
bar(const foo& f); // want to read f
bar(foo& f); // want to modify f
所有其他簽名應該只是謹慎使用,并且有充分的理由。編譯器現在幾乎總是以最有效的方式解決這些問題。您可以繼續編寫代碼!
TA貢獻1779條經驗 獲得超6個贊
如果在函數體內部需要對象的副本或者只需要移動對象,則按值傳遞參數。const&如果您只需要對對象進行非變異訪問,則傳遞。
對象復制示例:
void copy_antipattern(T const& t) { // (Don't do this.)
? ? auto copy = t;
? ? t.some_mutating_function();
}
void copy_pattern(T t) { // (Do this instead.)
? ? t.some_mutating_function();
}
對象移動示例:
std::vector<T> v;?
void move_antipattern(T const& t) {
? ? v.push_back(t);?
}
void move_pattern(T t) {
? ? v.push_back(std::move(t));?
}
非變異訪問示例:
void read_pattern(T const& t) {
? ? t.some_const_function();
}
- 3 回答
- 0 關注
- 565 瀏覽
添加回答
舉報
