自動 const 和引用
auto
關鍵字本身代表一種值型別,類似於 int
或 char
。可以使用 const
關鍵字和 &
符號對其進行修改,以分別表示 const 型別或引用型別。這些修飾符可以組合使用。
在這個例子中,s
是一個值型別(它的型別將被推斷為 std::string
),因此 for
迴圈的每次迭代都會將一個字串從向量複製到 s
中。
std::vector<std::string> strings = { "stuff", "things", "misc" };
for(auto s : strings) {
std::cout << s << std::endl;
}
如果迴圈的主體修改了 s
(例如通過呼叫 s.append(" and stuff")
),則只會修改此副本,而不是 strings
的原始成員。
另一方面,如果使用 auto&
宣告 s
,它將是一個引用型別(推斷為 std::string&
),因此在迴圈的每次迭代中,它將被賦予對向量中的字串的引用 :
for(auto& s : strings) {
std::cout << s << std::endl;
}
在這個迴圈的主體中,對 s
的修改將直接影響它所引用的 strings
的元素。
最後,如果 s
被宣告為 const auto&
,它將是一個 const 引用型別,這意味著在迴圈的每次迭代中,它將被賦予對向量中字串的 const 引用 :
for(const auto& s : strings) {
std::cout << s << std::endl;
}
在這個迴圈的主體內,s
不能被修改(即不能在它上面呼叫非 const 方法)。
當使用 auto
和基於範圍的 for
迴圈時,如果迴圈體不會修改迴圈結構,通常使用 const auto&
是一種好習慣,因為這樣可以避免不必要的複製。