我认为问题很明确。将auto
关键字自动检测常量性,或总是返回一个非const类型,即使有如。函数的两个版本(一个返回const
,另一个不返回)。
仅作记录,我确实const auto end = some_container.end()
在for循环之前使用过,但我不知道这是否有必要甚至与normal不同auto
。
Answers:
也许你感到困惑const_iterator
和const iterator
。第一个迭代const元素,第二个根本无法迭代,因为您无法operators
在其上使用++和-。
请注意,您很少从迭代container.end()
。通常,您将使用:
const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
const auto
在这种一般情况下有用吗?
编译器推导自动限定符的类型。如果推导类型为some_type
,const auto
将转换为const some_type
。但是,一个好的编译器将检查auto
变量的整个范围,并确定变量的值是否在任何地方改变。如果不是,编译器本身将推导如下类型:auto
-> const some_type
。我已经在Visual Studio Express 2012中进行了尝试,在两种情况下产生的机器代码都是相同的,我不确定每个编译器都可以做到。但是,const auto
出于以下三个原因,这是一个好习惯:
const
的auto
。const
的auto
,如果它不以任何方式改变程序的功能。这还包括检查是否有const和非const成员函数可用。编译器会正确执行。
cbegin
并cend
返回一个const_iterator
按值。const auto
仍然有目的,并非多余。