`const auto`有什么意义?

我觉得这个问题很清楚。 auto关键字会自动检测常量,或者总是返回非consttypes,即使存在例如。 两个版本的函数(一个返回const ,另一个不返回)。

只是为了logging,我在我的for循环之前使用const auto end = some_container.end() ,但是我不知道这是否是必要的,甚至不同于普通的auto

也许你正在混淆const_iteratorconst iterator 。 第一个遍历const元素,第二个不能迭代,因为你不能使用operators ++和 – 。

请注意,你很less从container.end()迭代。 通常你会使用:

 const auto end = container.end(); for (auto i = container.begin(); i != end; ++i) { ... } 
 const auto x = expr; 

不同于

 auto x = expr; 

 const X x = expr; 

不同于

 X x = expr; 

所以使用const autoconst auto& ,就像你没有auto

重载parsing不受返回types的影响:左值x上的const或no const不影响expr中调用的函数。

考虑你有两个模板:

 template<class U> void f1( U& u ); // 1 template<class U> void f2( const U& u ); // 2 

auto会推导出types,variables的types与参数u相同(如// 1情况), const auto将使variables与参数u// 2中的types相同。 所以const auto只是强制const限定符。

编译器会推导出自动限定符的types。 如果演绎types是some_type ,则const auto将被转换为const some_type 。 但是,一个好的编译器会检查autovariables的整个范围,并查看它的值是否在任何地方改变。 如果没有,编译器本身会推断出这样的types: auto – > const some_type 。 我已经在Visual Studio Express 2012中试过了,在这两种情况下生成的机器代码都是相同的,我不确定每个编译器都会这样做。 但是,使用const auto有三个好处:

  • 防止编码错误。 你打算让这个variables不要改变,但不知怎的,它的范围内的某处改变了。
  • 代码可读性得到改善。
  • 如果由于某种原因,它不会为auto推导出const ,那么你可以帮助编译器。