`const auto`有什么意义?
我觉得这个问题很清楚。 auto
关键字会自动检测常量,或者总是返回非consttypes,即使存在例如。 两个版本的函数(一个返回const
,另一个不返回)。
只是为了logging,我在我的for循环之前使用const auto end = some_container.end()
,但是我不知道这是否是必要的,甚至不同于普通的auto
。
也许你正在混淆const_iterator
和const 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 auto
和const 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
。 但是,一个好的编译器会检查auto
variables的整个范围,并查看它的值是否在任何地方改变。 如果没有,编译器本身会推断出这样的types: auto
– > const some_type
。 我已经在Visual Studio Express 2012中试过了,在这两种情况下生成的机器代码都是相同的,我不确定每个编译器都会这样做。 但是,使用const auto
有三个好处:
- 防止编码错误。 你打算让这个variables不要改变,但不知怎的,它的范围内的某处改变了。
- 代码可读性得到改善。
- 如果由于某种原因,它不会为
auto
推导出const
,那么你可以帮助编译器。