C++ 合格推荐人
8.3.2/1: Cv限定引用的格式不正确,除非Cv限定符 通过使用typedef名称(7.1.3、14.1)或 decltype Specifier(7.1.6.2),在这种情况下,cv限定符为 忽略 通过C++ 合格推荐人,c++,gcc,clang,C++,Gcc,Clang,8.3.2/1: Cv限定引用的格式不正确,除非Cv限定符 通过使用typedef名称(7.1.3、14.1)或 decltype Specifier(7.1.6.2),在这种情况下,cv限定符为 忽略 通过gcc和clang进行编译 为什么??是虫子吗 标准提供的示例: typedef int& A; const A aref = 3; // ill-formed; lvalue reference to non-const initialized with rvalue 在您的示例
gcc
和clang
进行编译
为什么??是虫子吗
标准提供的示例:
typedef int& A;
const A aref = 3; // ill-formed; lvalue reference to non-const initialized with rvalue
在您的示例中,您没有cv限定参考。本标准的引用是指以下格式不正确的声明
int a = 5;
const int & const b = a;
typedef int& A;
const A aref = 3;
这里b是一个cv限定引用,代码段格式不正确
对于代码片段,它声明了对const对象的引用
此代码段格式不正确
int a = 5;
const int & const b = a;
typedef int& A;
const A aref = 3;
因为它相当于
int & const aref = 3;
比较这两个声明会更清楚
int x;
int * const p = &x;
int & const r = x;
cv限定指针的声明有效,而cv限定引用的声明格式不正确。我认为它引用了
int&const b=a代码>。顺便说一句,你为什么认为这是一个bug?const inst&
不是cv限定的引用,它是对cv限定的int的引用。如果你说const int*
(或者像我写的那样int const*
),可能更容易理解不是指向int的常量指针,而是指向常量int的指针。常量指针应该是int*const
@Dmitry:该示例“扩展为”int&const aref=3
和常量将由于您引用的规则而被删除。(需要明确的是:int-const&
和int-const&
是一回事,但是int-const
是一个完全不同的野兽,你不能直接写。)你说得对,@DmitryFucintv,声明int-const b=a代码>没有意义,您引用的标准中的一段是这样说的:“Cv限定引用文件格式错误”!在第一个代码段中,有两个常量
,但左边的第一个是多余的。第二个代码段无效,因为它从整数常量(文本)创建了对非常量int的引用。关于这一点,使用typedef名称不正是允许的例外吗?在这种情况下,cv限定符被忽略了吗?@Ulrich Eckhardt这不是多余的。我从最初的文章中选取了这个例子,并添加了一个限定符来说明标准所说的内容。我称之为多余,因为代码段仅因最右边的常量而无效,第一个并不重要。但无论如何,这是品味的问题。你能澄清一件事吗?是常数A b代码>和A常数b代码>完全等效?如果是这样,那么我已经理解了标准的意图。