讀取基于范圍環的一些例子他們建議兩種主要方式1,2,3,4std::vector<MyClass> vec;for (auto &x : vec){ // x is a reference to an item of vec // We can change vec's items by changing x }要么for (auto x : vec){ // Value of x is copied from an item of vec // We can not change vec's items by changing x}好。當我們不需要更改vec項目時,IMO,示例建議使用第二個版本(按值)。為什么他們不建議const引用的東西(至少我沒有找到任何直接的建議):for (auto const &x : vec) // <-- see const keyword{ // x is a reference to an const item of vec // We can not change vec's items by changing x }不是更好嗎?它是不是避免了每次迭代中的冗余副本,而它是一個const?
3 回答
繁星coding
TA貢獻1797條經驗 獲得超4個贊
如果您不想更改項目以及想要避免復制,那么這auto const &是正確的選擇:
for (auto const &x : vec)
建議你使用的人auto &是錯的。別管他們。
這是概述:
選擇
auto x何時使用副本。選擇
auto &x何時使用原始項目并可以修改它們。選擇
auto const &x何時使用原始項目,不會修改它們。
HUWWW
TA貢獻1874條經驗 獲得超12個贊
當我們不需要更改vec項目時,示例建議使用第一個版本。
然后他們給出了錯誤的建議。
為什么他們不建議const引用的東西
因為他們給出了錯誤的建議:-)你提到的是正確的。如果您只想觀察一個對象,則無需創建副本,也不需要對其進行非const引用。
編輯:
我看到你鏈接的引用都提供了迭代一系列int值或一些其他基本數據類型的示例。在這種情況下,由于復制int并不昂貴,因此創建副本基本上等同于(如果不是更有效)進行觀察const &。
但是,對于用戶定義的類型,通常不是這種情況。復制UDT可能很昂貴,如果您沒有理由創建副本(例如修改檢索到的對象而不更改原始副本),則最好使用a const &。
- 3 回答
- 0 關注
- 539 瀏覽
添加回答
舉報
0/150
提交
取消
