c++ 自动参考混淆

plicqrtu  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(184)

我试图了解使用auto作为参考的细节。
但是,在执行了下面的基本代码后,我有点困惑。

  1. int x = 99;
  2. const int& xr = x;
  3. auto& xr2 = xr ;
  4. xr2 = 88;

我读到C++中的auto关键字可以消除const和reference限定符,所以我希望xr2的类型是int&。但是,我收到了一条错误消息,上面写着“错误:只读引用xr2的赋值。”您能解释一下为什么吗?
最好的问候。

fslejnso

fslejnso1#

auto xr2 = xr;总是非常量非引用,是的。
但是,当您添加&时,它不再破坏稳定性,并且始终是一个(左值)引用。

w3nuxt5m

w3nuxt5m2#

auto的规则相当简单,因为它们反映了函数模板参数推导的规则:
如果 * 占位符类型说明符 * 的形式为 * type-constraint * opt auto,则替换T的推导类型T'将使用模板参数推导规则来确定。
[...]

  • [示例2:*
  1. const auto &i = expr;

i的类型是以下发明的函数模板的调用f(expr)中参数u的推导类型:

  1. template <class U> void f(const U& u);
  • --end example]*
  • http://eel.is/c++draft/dcl.type.auto.deduct#3

* 衰减 *-auto删除cv限定符时

auto关键字并不总是允许删除cv限定符(constvolatile);仅当将变量声明为非引用时。例如:

  1. const volatile int& x = ...;
  2. // y is of type int, with no cv-qualifiers
  3. auto y = x;

这是因为cv限定符在传递给非引用函数参数时被丢弃(这称为 * decay *)。auto变量遵循函数模板参数推导的规则,所以这里也会发生同样的事情。

为什么你的示例不编译

在您的示例中,所有auto的使用仍然涉及&,因此不会发生衰减,并且保留了cv限定符。您的代码无法编译,因为发生了以下情况:

  1. int x = 99;
  2. const int& xr = x;
  3. // auto deduces to const int
  4. // xr2 is declared as const int&, just like xr
  5. auto& xr2 = xr ;
  6. // error: assigning 88 to const variable
  7. xr2 = 88;
展开查看全部

相关问题