我认为问题很清楚。 auto
关键字是否会自动检测const-ness,或者总是返回非const类型,即使有例如。函数的两个版本(一个返回const
而另一个不返回)。
仅仅为了记录,我在for循环之前使用const auto end = some_container.end()
,但我不知道这是否必要或甚至与普通auto
不同。
答案 0 :(得分:82)
const auto x = expr;
与
不同auto x = expr;
作为
const X x = expr;
与
不同X x = expr;
因此,请使用const auto
和const auto&
,就像您没有auto
一样。
重载决策不受返回类型的影响:const
或左侧const
上的x
不会影响expr
中调用的函数。
答案 1 :(得分:26)
也许您会混淆const_iterator
和const iterator
。第一个迭代const元素,第二个不能迭代,因为你不能使用operators
++和 - 。
请注意,您很少从container.end()
进行迭代。通常你会使用:
const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
答案 2 :(得分:7)
考虑您有两个模板:
template<class U> void f1( U& u ); // 1
template<class U> void f2( const U& u ); // 2
auto
将推断类型,变量将与参数u
具有相同的类型(如// 1
情况),const auto
将使变量成为相同的类型正如参数u
在// 2
案例中所具有的那样。所以const auto
只需强制const
限定符。
答案 3 :(得分:2)
编译器推断出自动限定符的类型。如果推断的类型为some_type
,则const auto
将转换为const some_type
。但是,一个好的编译器会检查auto
变量的整个范围,并查找它的值是否在任何地方发生变化。如果没有,编译器本身将推导出如下类型:auto
- &gt; const some_type
。我已经在Visual Studio express 2012中尝试了这个,并且在这两种情况下生成的机器代码是相同的,我不确定每个编译器都会这样做。
但是,最好使用const auto
有三个原因:
const
推断auto
,您可以帮助编译器。