以下代码无效:
struct base {
};
struct inherit : const base {
};
您无法继承const
类型。
涉及模板时情况是否会发生变化?换句话说,这段代码是否有效:
struct base {
};
template<typename T>
struct inherit : T {
using T::T;
};
int main() {
inherit<base const>{};
}
gcc说这很好,但是clang报道
<source>:6:2: error: 'const base' is not a direct base of 'inherit<const base>', cannot inherit constructors
using T::T;
^ ~
<source>:10:2: note: in instantiation of template class 'inherit<const base>' requested here
inherit<base const>{};
^
1 error generated.
Compiler returned: 1
为了让clang高兴,我需要做这样的事情:
template<typename T>
struct inherit : T {
using U = std::remove_const_t<T>;
using U::U;
};
哪个版本正确?或者它们都不正确我需要继承std::remove_const_t<T>
?
答案 0 :(得分:16)
感谢@T.C.我们:
type-parameter ,其标识符不遵循省略号,将其标识符定义为 typedef-name (如果使用{{声明) 1}}或
class
)...在模板声明的范围内。
所以它就像typename
一样。
如果在需要 class-name 的地方使用了名为 cv-qualified 类类型的 typedef-name ,那么
将被忽略。
因此GCC是正确的,typedef
在继承const
时应该被删除,因为 class-name 是必需的at that point,以及using T::T;
继承构造函数声明。