`const auto`有什么意义吗?

时间:2011-02-21 19:48:43

标签: c++ c++11 const

我认为问题很清楚。 auto关键字是否会自动检测const-ness,或者总是返回非const类型,即使有例如。函数的两个版本(一个返回const而另一个不返回)。

仅仅为了记录,我在for循环之前使用const auto end = some_container.end(),但我不知道这是否必要或甚至与普通auto不同。

4 个答案:

答案 0 :(得分:82)

const auto x = expr;

不同
auto x = expr;

作为

const X x = expr;

不同
X x = expr;

因此,请使用const autoconst auto&,就像您没有auto一样。

重载决策不受返回类型的影响:const或左侧const上的x不会影响expr中调用的函数。

答案 1 :(得分:26)

也许您会混淆const_iteratorconst 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,您可以帮助编译器。