无法将 const 应用于 typedef 引用
Cannot apply const to typedef reference
以下代码在将 const
应用于 value_type&
的 return 值引用时有效,但如果我使用相同类型的 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_type&
而编译正常,这将不起作用。
不能将 const 应用于引用,例如 const(ref(type))。
但是您可以引用 const 类型,例如 ref(const(type)).
这里有两个不同的问题。
首先,在:
typedef T* pointer;
typedef const pointer const_pointer;
const_pointer
的类型实际上是T* const
,而不是const T*
。 constness 附加到指针,而不是指向的类型。
现在引用遵循相同的逻辑:如果您为引用类型创建一个 typedef,并尝试将 const
附加到它,它会尝试将 const
应用于引用类型,不是引用类型。但与指针不同,引用不允许具有顶级 cv 限定。如果您尝试提及 T& const
,这是一个编译错误。但是,如果您尝试通过 typedef 附加 cv 限定,它就会被忽略。
Cv-qualified references are ill-formed except when the cv-qualifiers are introduced
through the use of a typedef-name (7.1.3, 14.1) or *decltype-specifier *(7.1.6.2), in which case the cv-qualifiers
are ignored.
([dcl.ref]/1)
所以第二个问题是GCC认为这是一个错误,而标准明确指出它不应该是一个错误,它应该忽略const
。我认为这是 GCC 中的错误。 Clang 不会产生错误:http://coliru.stacked-crooked.com/a/5b5c105941066708
以下代码在将 const
应用于 value_type&
的 return 值引用时有效,但如果我使用相同类型的 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_type&
而编译正常,这将不起作用。
不能将 const 应用于引用,例如 const(ref(type))。
但是您可以引用 const 类型,例如 ref(const(type)).
这里有两个不同的问题。
首先,在:
typedef T* pointer;
typedef const pointer const_pointer;
const_pointer
的类型实际上是T* const
,而不是const T*
。 constness 附加到指针,而不是指向的类型。
现在引用遵循相同的逻辑:如果您为引用类型创建一个 typedef,并尝试将 const
附加到它,它会尝试将 const
应用于引用类型,不是引用类型。但与指针不同,引用不允许具有顶级 cv 限定。如果您尝试提及 T& const
,这是一个编译错误。但是,如果您尝试通过 typedef 附加 cv 限定,它就会被忽略。
Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name (7.1.3, 14.1) or *decltype-specifier *(7.1.6.2), in which case the cv-qualifiers are ignored.
([dcl.ref]/1)
所以第二个问题是GCC认为这是一个错误,而标准明确指出它不应该是一个错误,它应该忽略const
。我认为这是 GCC 中的错误。 Clang 不会产生错误:http://coliru.stacked-crooked.com/a/5b5c105941066708