【发布时间】:2011-07-01 12:41:05
【问题描述】:
我认为这个问题已经很清楚了。 auto 关键字会自动检测 const-ness,还是总是返回非 const 类型,即使有例如。函数的两个版本(一个返回 const,另一个不返回)。
为了记录,我确实在我的 for 循环之前使用了 const auto end = some_container.end(),但我不知道这是否有必要,甚至与普通的 auto 不同。
【问题讨论】:
我认为这个问题已经很清楚了。 auto 关键字会自动检测 const-ness,还是总是返回非 const 类型,即使有例如。函数的两个版本(一个返回 const,另一个不返回)。
为了记录,我确实在我的 for 循环之前使用了 const auto end = some_container.end(),但我不知道这是否有必要,甚至与普通的 auto 不同。
【问题讨论】:
也许你混淆了const_iterator 和const iterator。第一个迭代 const 元素,第二个根本不能迭代,因为你不能使用 operators ++ 和 -- 在它上面。
请注意,您很少从 container.end() 进行迭代。通常你会使用:
const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
【讨论】:
cbegin 和 cend 按值返回 const_iterator。 const auto 仍然有它的用途,不是多余的。
const auto 在这种一般情况下有用吗?
假设您有两个模板:
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 限定符。
【讨论】:
const auto x = expr;
不同于
auto x = expr;
作为
const X x = expr;
不同于
X x = expr;
所以要经常使用const auto 和const auto&,就像没有auto 时一样。
重载分辨率不受返回类型的影响:const 或左值 x 上没有 const 不会影响在 expr 中调用的函数。
【讨论】:
const。
编译器推导出自动限定符的类型。如果推导类型为some_type,则const auto 将转换为const some_type。但是,一个好的编译器会检查auto 变量的整个范围,并找出它的值是否在任何地方发生了变化。如果不是,编译器本身会推断出这样的类型:auto -> const some_type。我已经在 Visual Studio Express 2012 中尝试过,并且在这两种情况下生成的机器代码都是相同的,我不确定每个编译器都会这样做。
但是,使用const auto 是一个很好的做法,原因有以下三个:
auto 推断出 const,您可以帮助编译器。【讨论】:
const 推断为auto 是完全合法的如果它没有以任何方式改变程序功能。这还包括检查是否有可用的 const 和非常量成员函数。编译器会正确处理。
auto 变量的整个范围,并找出它的值是否在任何地方发生了变化。如果不是,编译器本身会推断出这样的类型:auto -> const some_type。 如果你不尝试更改变量,你怎么知道它是否被推断为const?无论如何,我不相信这一点。