C++ “const auto”有什么意思吗?
我认为这个问题很清楚。C++ “const auto”有什么意思吗?,c++,c++11,constants,C++,C++11,Constants,我认为这个问题很清楚。auto关键字是否会自动检测常量,或始终返回非常量类型,即使函数有两个版本(一个返回const,另一个不返回) 为了记录,我确实在for循环之前使用了const auto end=some_container.end(),但我不知道这是否必要,甚至与正常的auto不同,可能您混淆了const_迭代器和const迭代器。第一个循环遍历常量元素,第二个循环根本无法遍历,因为不能在其上使用运算符++和-- 请注意,您很少从容器.end()进行迭代。通常,您将使用: const a
auto
关键字是否会自动检测常量,或始终返回非常量类型,即使函数有两个版本(一个返回const
,另一个不返回)
为了记录,我确实在for循环之前使用了
const auto end=some_container.end()
,但我不知道这是否必要,甚至与正常的auto
不同,可能您混淆了const_迭代器
和const迭代器
。第一个循环遍历常量元素,第二个循环根本无法遍历,因为不能在其上使用运算符++和--
请注意,您很少从容器.end()进行迭代。通常,您将使用:
const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }
假设您有两个模板:
template<class U> void f1( U& u ); // 1
template<class U> void f2( const U& u ); // 2
模板无效f1(U&U);//1.
模板无效f2(常量U和U);//2.
auto
将推断类型,变量将与参数u
具有相同的类型(与/1
案例相同),const auto
将使变量与/2
案例中的参数u
具有相同的类型。所以const auto
只需强制const
限定符即可
const auto x = expr;
不同于
auto x = expr;
X x = expr;
作为
不同于
auto x = expr;
X x = expr;
所以经常使用const auto
和const auto&
,就像没有auto
时一样
重载解析不受返回类型的影响:const
或左值x
上的noconst
不影响在expr
中调用的函数expr编译器推断自动限定符的类型。如果导出的类型是some\u type
,const auto
将转换为const some\u type
。然而,一个好的编译器会检查auto
变量的整个范围,并发现它的值是否在任何地方发生了变化。如果不是,编译器本身将推断如下类型:auto
->const some\u type
。我曾在Visual studio express 2012中尝试过这一点,在这两种情况下生成的机器代码都是相同的,我不确定每个编译器是否都能做到这一点。
但是,使用const auto
是一种很好的做法,原因有三:
- 防止编码错误。您希望此变量不发生更改,但在其范围内的某个地方,它发生了更改
- 提高了代码的可读性
- 如果编译器由于某种原因没有为
auto
推导const
,则可以帮助编译器
cbegin
和cend
按值返回一个常量迭代器const auto
仍然有它的用途,并不是多余的。所以在这种情况下,const auto
是有用的吗?@dalle:在你发表评论之前,我已经删除了我的段落,因为我意识到我说的只是一些无稽之谈:)有人写了太多sql:)auto被const修改为&,它可以在foreach中使用,例如:否。如果您不打算(或应该)修改变量,它应该声明为const
。回答非常简洁明了…如果可能,编译器将不会推断const。。。仅当它推断类型的表达式本身已经是常量时,它才会添加常量。如果编译器只是为了可能而添加常量,那么程序语义可能会被破坏,例如根据特定编译器是否可以推断常量来调用常量与非常量成员函数。因此,我认为你最后一点是错误的。@ RuNVB的C++标准允许编译器以适合它们的方式重新组织代码,这取决于所需的优化。如果编译器没有以任何方式改变程序功能,那么为auto
推导const
是完全合法的。这还包括检查是否有常量和非常量成员函数可用。编译器会做得很好。