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
我的实际代码使用模板,但我已经删除了示例中的模板,并替换了classT
。这与错误无关
如果指定
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
触发了不同的代码路径。