关于自动恒定参考的说明

时间:2017-11-27 03:18:16

标签: c++ c++11

在此代码中:

int a=8; 
const int &b = a;           //b is a Low-Level const
auto c = b; 

我希望c是常量int类型,因为它已auto为低级别const。但它指的是a(已被b替换),而不是b的声明。

c仅在使用b

时选择auto &c =b类型

据我所知,只有顶级const被删除。那么有人可以解释我的理解有什么问题吗?

在指针的情况下,auto选择低级别const:

int i=9;
const int * p=&i;
auto *d=p;
*d=45;   // error: assignment of read-only location ‘* d’

3 个答案:

答案 0 :(得分:3)

自动使用模板类型扣除规则。它的长短是因为使用auto时引用会被删除(这就是为什么你会看到decltype(auto)之类的东西作为函数的返回,因为它使用了一组不同的类型规则扣)。

Scott Meyers在Effective Modern C ++的第2项中详细介绍了规则。

答案 1 :(得分:3)

表达式的类型绝不是引用类型。表达式具有非引用类型和值类别。

声明const int &b = a;表示:

  • 会有一个名为b的变量。
  • 表达式b的类型为const int
  • 表达式b指定与a相同的对象。换句话说,名称ab都指向同一个对象。
  • 代码decltype(b)解析为const int&,但除此之外,您无法访问"历史记录"一个参考。一旦它受到约束,它之后只是一个int的名称。

auto c = X;表示c未被声明为参考;并且它的类型是从表达式X的类型推导出来的。如果X碰巧是变量的标识符,那么它不会调用任何特殊规则;在所有情况下,X都被视为表达。

语法decltype(auto) C = X;存在;如果X是变量的名称,那么这意味着C的声明方式与X相同。(如果X不是变量的名称,那么行为也取决于X的值类别)。

在您的第一个示例中,c是从表达式b const int的类型推导出来的。如您所述,此处删除了顶级常量,因此auto c表示int c

在第二个示例中,表达式p的类型为const int *。这不是顶级常量,因此auto d = p;将为const int * d = p;。在这种情况下,auto *dauto d没有区别。

答案 2 :(得分:0)

在第一个例子中,b和a是链接的,但是c变成常量,这是因为b中的const生效。第二个例子的问题是* d是类型const int,不能修改。

希望这有帮助。