`const auto`有什么意义吗?

99

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

只是为了记录,我在我的 for 循环之前使用 const auto end = some_container.end(),但我不知道这是否必要或与普通的 auto 有什么区别。

4个回答

112
const auto x = expr;

与...不同

auto x = expr;

as

const X x = expr;

与...不同

X x = expr;

大量使用 const autoconst auto&,就像没有 auto 一样。

重载决议不受返回类型影响:x 的左值 const 或无 const 不影响在 expr 中调用哪个函数。


18
不。如果您不打算(或者不应该)修改变量,那么应该声明为“const”。 - Paul J. Lucas

37
也许你混淆了const_iteratorconst iterator。第一个遍历常量元素,而第二个根本无法迭代,因为您无法在其上使用运算符 ++ 和--。
请注意,您很少从container.end()开始迭代。通常会使用:
const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }

12
cbegincend以值形式返回一个const_iteratorconst auto仍然有其作用,不是多余的。 - dalle
2
那么在这种一般情况下,const auto 是有用的吗? - rubenvb
2
有人写了太多的 SQL。 :) - Andres Jaan Tack
3
auto 被 const 和 & 修饰时,可以在 foreach 中使用,例如:http://en.cppreference.com/w/cpp/language/auto - Janosimas
我认为/=对于!=来说是一个更好的错误。 - Alexis Wilke
显示剩余3条评论

7

假设你有两个模板:

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

auto会推导类型,这个变量的类型和u参数的类型相同(就像// 1情况一样),const auto会让这个变量的类型与// 2情况中u参数的类型相同。因此const auto只是强制加上了const限定符。


3
编译器会为auto限定符推断类型。如果一个推断的类型是“some_type”,那么“const auto”将转换为“const some_type”。然而,一个好的编译器会检查整个“auto”变量的范围,并查找其值是否在任何地方发生了改变。如果没有,编译器本身会像这样推断类型:“auto” -> “const some_type”。我在Visual Studio Express 2012中尝试过这种情况,产生的机器代码在两种情况下都是相同的,但我不确定每个编译器都会这样做。 但是,使用“const auto”有三个好处:
- 防止编码错误。您打算让这个变量不改变,但在其范围内的某个地方它被改变了。 - 提高代码可读性。 - 如果由于某种原因编译器没有推断出“const”和“auto”,您可以帮助编译器。

编译器不会推断const,如果可能的话...它只会在推断类型的表达式本身已经是const的情况下添加const。如果编译器仅仅为了可能性而添加const,程序语义可能会被破坏,例如调用const和非const成员函数取决于特定编译器是否能够推断const。因此,我认为你最后的观点是错误的。 - rubenvb
C++标准允许编译器根据所需的优化方式重新组织代码。如果不改变程序功能,编译器完全可以为auto推断const。这也包括检查是否有可用的const和非const成员函数。编译器会做正确的事情。 - BJovke
一个好的编译器将检查整个 auto 变量的范围,并查找其值是否在任何地方更改。如果没有更改,编译器本身将推断类型如下:auto -> const some_type。如果您不尝试更改变量,那么您怎么知道它是否被推断为 const 呢?无论如何,我不相信这个。 - Paul Sanders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接