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