自动 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& 是一种好习惯,因为这样可以避免不必要的复制。