C++ 合格推荐人

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 在您的示例

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

在您的示例中,您没有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完全等效?如果是这样,那么我已经理解了标准的意图。