自動 const 和引用

auto 關鍵字本身代表一種值型別,類似於 intchar。可以使用 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& 是一種好習慣,因為這樣可以避免不必要的複製。