在此代码中:
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’
答案 0 :(得分:3)
自动使用模板类型扣除规则。它的长短是因为使用auto
时引用会被删除(这就是为什么你会看到decltype(auto)
之类的东西作为函数的返回,因为它使用了一组不同的类型规则扣)。
Scott Meyers在Effective Modern C ++的第2项中详细介绍了规则。
答案 1 :(得分:3)
表达式的类型绝不是引用类型。表达式具有非引用类型和值类别。
声明const int &b = a;
表示:
b
的变量。b
的类型为const int
。b
指定与a
相同的对象。换句话说,名称a
和b
都指向同一个对象。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 *d
与auto d
没有区别。
答案 2 :(得分:0)
在第一个例子中,b和a是链接的,但是c变成常量,这是因为b中的const生效。第二个例子的问题是* d是类型const int,不能修改。
希望这有帮助。