const auto有什么意思吗?


82

我认为问题很明确。将auto关键字自动检测常量性,或总是返回一个非const类型,即使有如。函数的两个版本(一个返回const,另一个不返回)。

仅作记录,我确实const auto end = some_container.end()在for循环之前使用过,但我不知道这是否有必要甚至与normal不同auto

Answers:


31

也许你感到困惑const_iteratorconst iterator。第一个迭代const元素,第二个根本无法迭代,因为您无法operators在其上使用++和-。

请注意,您很少从迭代container.end()。通常,您将使用:

const auto end = container.end();
for (auto i = container.begin(); i != end; ++i) { ... }

12
cbegincend返回一个const_iterator按值。const auto仍然有目的,并非多余。
dalle

2
那么const auto在这种一般情况下有用吗?
rubenvb

@dalle:我已经删除了我的段落,然后再发表评论,因为意识到我刚才说的是荒谬的话:)
Benoit

2
有人写了太多的sql。:)
Andres Jaan Tack

3
auto由const修饰为&,可以在foreach中使用,例如:en.cppreference.com/w/cpp/language/auto
Janosimas

97
const auto x = expr;

不同于

auto x = expr;

const X x = expr;

不同于

X x = expr;

因此,使用const autoconst auto&大量的,就像你,如果你没有auto

重载解析不受返回类型的影响:const或者const左值上的nox不影响in中调用的函数expr


17
不。如果您不打算(或不打算)修改变量,则应将其声明为const
保罗·卢卡斯

7

考虑您有两个模板:

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

auto将推断出类型,并且变量将与参数具有相同的类型u(如// 1情况所示),const auto将使变量与参数u具有与// 2案例中的类型相同的类型。因此,const auto只需强制const预选赛即可。


3

编译器推导自动限定符的类型。如果推导类型为some_typeconst auto将转换为const some_type。但是,一个好的编译器将检查auto变量的整个范围,并确定变量的值是否在任何地方改变。如果不是,编译器本身将推导如下类型:auto-> const some_type。我已经在Visual Studio Express 2012中进行了尝试,在两种情况下产生的机器代码都是相同的,我不确定每个编译器都可以做到。但是,const auto出于以下三个原因,这是一个好习惯:

  • 防止编码错误。您打算让该变量不改变,而是在其范围内的某个位置改变。
  • 代码可读性得到改善。
  • 你帮助编译器,如果由于某种原因,它不推断constauto

如果可能的话,编译器将不会推导const……仅在推导其类型的表达式本身已经是const时才添加const。如果编译器只是为了可能而添加const,则程序语义可能会被破坏,例如const与非const成员函数的调用取决于特定的编译器是否可以推导const。所以我认为您的最后一点是错误的。
rubenvb

@rubenvb C ++标准允许编译器根据所需的优化以适合它们的任何方式重新组织代码。这是完全合法的编译器来推断constauto ,如果它不以任何方式改变程序的功能。这还包括检查是否有const和非const成员函数可用。编译器会正确执行。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.