【问题标题】:does `const auto` have any meaning?`const auto` 有什么意义吗?
【发布时间】:2011-07-01 12:41:05
【问题描述】:

我认为这个问题已经很清楚了。 auto 关键字会自动检测 const-ness,还是总是返回非 const 类型,即使有例如。函数的两个版本(一个返回 const,另一个不返回)。

为了记录,我确实在我的 for 循环之前使用了 const auto end = some_container.end(),但我不知道这是否有必要,甚至与普通的 auto 不同。

【问题讨论】:

    标签: c++ c++11 constants


    【解决方案1】:

    也许你混淆了const_iteratorconst iterator。第一个迭代 const 元素,第二个根本不能迭代,因为你不能使用 operators ++ 和 -- 在它上面。

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

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

    【讨论】:

    • cbegincend 按值返回 const_iteratorconst auto 仍然有它的用途,不是多余的。
    • 那么const auto 在这种一般情况下有用吗?
    • @dalle:在你发表评论之前,我已经删除了我的段落,因为我意识到我说的只是无意义的话:)
    • 有人写太多sql了。 :)
    • auto 被 const 修改为 &,可以在 foreach 中使用,例如:en.cppreference.com/w/cpp/language/auto
    【解决方案2】:

    假设您有两个模板:

    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】:
      const auto x = expr;
      

      不同于

      auto x = expr;
      

      作为

      const X x = expr;
      

      不同于

      X x = expr;
      

      所以要经常使用const autoconst auto&amp;,就像没有auto 时一样。

      重载分辨率不受返回类型的影响:const 或左值 x 上没有 const 不会影响在 expr 中调用的函数。

      【讨论】:

      • 没有。如果您不打算(或不应该)修改该变量,则应将其声明为const
      【解决方案4】:

      编译器推导出自动限定符的类型。如果推导类型为some_type,则const auto 将转换为const some_type。但是,一个好的编译器会检查auto 变量的整个范围,并找出它的值是否在任何地方发生了变化。如果不是,编译器本身会推断出这样的类型:auto -> const some_type。我已经在 Visual Studio Express 2012 中尝试过,并且在这两种情况下生成的机器代码都是相同的,我不确定每个编译器都会这样做。 但是,使用const auto 是一个很好的做法,原因有以下三个:

      • 防止编码错误。您希望此变量不发生变化,但不知何故在其范围内的某个地方发生了变化。
      • 提高了代码的可读性。
      • 如果由于某种原因它没有为 auto 推断出 const,您可以帮助编译器。

      【讨论】:

      • 如果可能的话,编译器不会推导出 const... 只有当它推导类型的表达式本身已经是 const 时,它才会添加 const。如果编译器只是为了可能而添加 const,则程序语义可能会被破坏,例如调用 const 与非 const 成员函数,具体取决于特定编译器是否可以推断出 const。所以我认为你的最后一点是错误的。
      • @rubenvb C++ 标准允许编译器根据所需的优化以适合自己的方式重新组织代码。编译器将const 推断为auto 是完全合法的如果它没有以任何方式改变程序功能。这还包括检查是否有可用的 const 和非常量成员函数。编译器会正确处理。
      • 一个好的编译器会检查auto 变量的整个范围,并找出它的值是否在任何地方发生了变化。如果不是,编译器本身会推断出这样的类型:auto -> const some_type 如果你不尝试更改变量,你怎么知道它是否被推断为const?无论如何,我不相信这一点。
      猜你喜欢
      • 2011-06-30
      • 2011-12-04
      • 2012-08-07
      • 2012-05-29
      • 1970-01-01
      • 2016-12-09
      • 2016-09-16
      • 2010-09-23
      相关资源
      最近更新 更多