如果引用对象是 const,则 const auto & 和 auto & 之间的区别

新手上路,请多包涵
// case 1
const int i = 42;
const auto &k = i;

// case 2
const int i = 42;
auto &k = i;

在这种情况下,我们是否需要在 const 之前使用 auto 关键字? After all, a reference ( k ) to an auto-deduced type will include the top level const of the object ( const int i )。所以我相信 k 在这两种情况下都是对一个常量( const int &k )的整数的引用。

If that is true, does that mean that const auto &k = i; in case 1 is replaced by the compiler as just const int &k = i; ( auto being replaced with int )?而在情况 2 中, auto 被替换为 const int

原文由 Steve Cho 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

auto 关键字在编译时自动决定变量的类型。

在第一种情况下, auto 减少为 int const int 在第二种情况下减少为—。因此,您的两种情况都简化为与以下相同的代码:

 const int &k = i;

但是,最好明确使用 const 以获得更好的可读性并确保您的变量 TRULYconst

原文由 Praneeth Peiris 发布,翻译遵循 CC BY-SA 4.0 许可协议

在第一种情况下 auto 将被推导出为 const int 和在第二种情况下 int 略有不同(正如您明确指出的那样)

cpp 参考状态

关键字 auto 可以伴随修饰符,例如 const 或 &,它们将参与类型推导。例如,给定 const auto& i = expr;,如果函数调用 f(expr) 已编译,则 i 的类型正是虚构模板模板 void f(const U& u) 中的参数 u 的类型。因此,根据初始化程序,auto&& 可以推导出为左值引用或右值引用,用于基于范围的 for 循环。

所以对你来说这意味着

// case 1
const int i = 42;
const auto &k = i;   // auto -> int

// case 2
const int i = 42;
auto &k = i;  // auto -> const int

但是,在我看来,更重要的是,如果您明确说明 const 并保证 constness,则意图会更清楚地说明。因此,在这种情况下,我显然更喜欢它。

原文由 user4290866 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题