我认为这个问题已经很清楚了。 auto
关键字是否会自动检测 const 属性,或者总是返回非 const 类型,即使有两个版本的函数(一个返回 const
,另一个不返回)。
只是为了记录,我在我的 for 循环之前使用 const auto end = some_container.end()
,但我不知道这是否必要或与普通的 auto
有什么区别。
const auto x = expr;
与...不同
auto x = expr;
as
const X x = expr;
与...不同
X x = expr;
大量使用 const auto
和 const auto&
,就像没有 auto
一样。
重载决议不受返回类型影响:x
的左值 const
或无 const
不影响在 expr
中调用哪个函数。
const_iterator
和const iterator
。第一个遍历常量元素,而第二个根本无法迭代,因为您无法在其上使用运算符
++ 和--。container.end()
开始迭代。通常会使用:const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
cbegin
和cend
以值形式返回一个const_iterator
。 const auto
仍然有其作用,不是多余的。 - dalleconst auto
是有用的吗? - rubenvb/=
对于!=
来说是一个更好的错误。 - Alexis Wilke假设你有两个模板:
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
限定符。
auto
推断const
。这也包括检查是否有可用的const和非const成员函数。编译器会做正确的事情。 - BJovkeauto
变量的范围,并查找其值是否在任何地方更改。如果没有更改,编译器本身将推断类型如下:auto
-> const some_type
。如果您不尝试更改变量,那么您怎么知道它是否被推断为 const
呢?无论如何,我不相信这个。 - Paul Sanders