C++ 关于自动到恒定参考的澄清
在此代码中:C++ 关于自动到恒定参考的澄清,c++,c++11,C++,C++11,在此代码中: int a=8; const int &b = a; //b is a Low-Level const auto c = b; 我希望c是常量int类型,因为它已被autoed设置为低级别常量。但是,它是指a(其别名为b)而不是b,用于其声明 c仅当像auto&c=b 据我所知,只有顶级常量被删除。有人能解释一下我的理解有什么问题吗 而对于指针,低电平常量由auto拾取: int i=9; const int * p=&i; auto *d
int a=8;
const int &b = a; //b is a Low-Level const
auto c = b;
我希望c
是常量int类型,因为它已被auto
ed设置为低级别常量。但是,它是指a
(其别名为b
)而不是b
,用于其声明
c
仅当像auto&c=b
据我所知,只有顶级常量被删除。有人能解释一下我的理解有什么问题吗
而对于指针,低电平常量由auto
拾取:
int i=9;
const int * p=&i;
auto *d=p;
*d=45; // error: assignment of read-only location ‘* d’
.自动使用模板类型扣除规则。它的长与短之处在于,使用
auto
时会删除引用(这就是为什么您会将decltype(auto)
之类的内容视为函数的返回,因为这使用了一组不同的类型推断规则)
Scott Meyers在有效的现代C++第2条中详细地介绍了规则。 < P> AutoUp使用模板类型演绎规则。它的长与短之处在于,使用
auto
时会删除引用(这就是为什么您会将decltype(auto)
之类的内容视为函数的返回,因为这使用了一组不同的类型推断规则)
Scott Meyers在有效的现代C++第2条中详细地介绍了规则。在第一个例子中, 是链接的,但是C变成常数,这是因为B的作用。第二个例子的问题是*d是不能修改的const int类型
希望这有帮助。在第一个示例中,b和a是链接的,但是c变为常量,这是因为b中的常量生效。第二个例子的问题是*d是不能修改的const int类型
希望这有帮助。表达式的类型永远不是引用类型。表达式具有非引用类型和值类别 声明
const int&b=a代码>表示:
- 将有一个名为
b
的变量
- 表达式
b
的类型为const int
- 表达式
b
指定与a
相同的对象。换句话说,名称a
和b
都指同一个对象
- 代码
decltype(b)
解析为const int&
,但除此之外,您无法访问引用的“历史记录”。一旦它被绑定,它只是一个int的名字
autoc=X
表示c
未声明为引用;它的类型是从表达式X
的类型推导出来的。如果X
恰好是变量的标识符,则不会调用任何特殊规则X
在所有情况下都被视为表达式
语法decltype(auto)C=X代码>存在;如果X是变量的名称,那么这意味着C的声明方式与X相同。(如果X不是变量的名称,那么行为也取决于X的值类别)
在第一个示例中,c
是从表达式b
的类型推导出来的,它是const int
。正如您所注意到的,顶级常量在这里被删除,因此autoc
意味着intc
在第二个示例中,表达式p
的类型是const int*
。这不是顶级常量,因此autod=p代码>将是const int*d=p代码>。在这种情况下,auto*d
与auto-d
没有区别,表达式的类型永远不是引用类型。表达式具有非引用类型和值类别
声明const int&b=a代码>表示:
- 将有一个名为
b
的变量
- 表达式
b
的类型为const int
- 表达式
b
指定与a
相同的对象。换句话说,名称a
和b
都指同一个对象
- 代码
decltype(b)
解析为const int&
,但除此之外,您无法访问引用的“历史记录”。一旦它被绑定,它只是一个int的名字
autoc=X
表示c
未声明为引用;它的类型是从表达式X
的类型推导出来的。如果X
恰好是变量的标识符,则不会调用任何特殊规则X
在所有情况下都被视为表达式
语法decltype(auto)C=X代码>存在;如果X是变量的名称,那么这意味着C的声明方式与X相同。(如果X不是变量的名称,那么行为也取决于X的值类别)
在第一个示例中,c
是从表达式b
的类型推导出来的,它是const int
。正如您所注意到的,顶级常量在这里被删除,因此autoc
意味着intc
在第二个示例中,表达式p
的类型是const int*
。这不是顶级常量,因此autod=p代码>将是const int*d=p代码>。在这种情况下,auto*d
与auto d
没有什么不同,因此只从表达式中删除引用,而不是指针,因此&attached with declarator b被删除,但是*attached with p不是?@AgrudgeAmicus指针声明器声明变量具有指针类型;引用声明器声明变量具有目标类型,并且将通过绑定到其他可能已经存在的对象来初始化该变量。因此,只有引用从表达式中删除,而不是指针,因此&attached with declarator b被删除,但是*attach