C++ 无法将常量应用于typedef引用

C++ 无法将常量应用于typedef引用,c++,constants,const-correctness,C++,Constants,Const Correctness,以下代码在将const应用于value\u类型&的返回值引用时起作用,但如果使用相同类型的typedef,则会出现错误 例如: class T { }; class A { public: typedef T value_type; typedef value_type& reference; // Not working const reference operator*() const; // But this works? //

以下代码在将
const
应用于
value\u类型&
的返回值引用时起作用,但如果使用相同类型的typedef,则会出现错误

例如:

class T {
};

class A {
public:
    typedef T value_type;
    typedef value_type& reference;

    // Not working
    const reference operator*() const;

    // But this works?
    //const value_type& operator*() const;
};

// Error!
const typename A::reference A::operator*() const {
}

int main() {
    return 0;
}
g++将出现以下错误:

'const' qualifiers cannot be applied
我的实际代码使用模板,但我已经删除了示例中的模板,并替换了class
T
。这与错误无关


如果指定
value\u type&
反而编译得很好,我不明白为什么这不起作用。

不能将常量应用于引用,比如常量(ref(type))


但是您可以引用常量类型,比如ref(const(type))。

这里有两个不同的问题

首先,在:

typedef T* pointer;
typedef const pointer const_pointer;
const\u指针的类型实际上是
T*const
,而不是
const T*
。常量附加到指针,而不是指向的类型

现在引用遵循相同的逻辑:如果您为引用类型创建一个typedef,并尝试将
const
附加到它,它将尝试将
const
应用到引用类型,而不是引用类型。但与指针不同的是,推荐人不允许具有顶级简历资格。如果您试图提及
T&const
,那就是编译错误。但是,如果您试图通过typedef附加cv限定,它将被忽略

除非引入Cv限定符,否则Cv限定引用的格式不正确 通过使用typedef名称(7.1.3、14.1)或*decltype说明符*(7.1.6.2),在这种情况下,cv限定符 都被忽略了

([dcl.ref]/1)


因此,第二个问题是,GCC认为这是一个错误,而标准明确规定这不应该是一个错误,它应该忽略
const
。我认为这是GCC中的一个bug。Clang不会产生错误:

我没有看到任何明显的错误,这在visual studio中编译并运行良好。我将等待更熟悉G++的人回答这个问题。尽管这似乎与标准报价相关。我不知道这是合法的。关于COMP.Lang.C.++有一个古老的(2008)讨论。对这个问题进行了适当的调整:但是找不到GCC bug报告。奇怪的是,<代码> const A::参考< /代码>作品。大概是毫无意义的
typename
触发了不同的代码路径。