继承自作为模板参数传递的const类型

时间:2018-05-25 17:26:19

标签: c++ c++11 c++14 language-lawyer

以下代码无效:

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>

1 个答案:

答案 0 :(得分:16)

感谢@T.C.我们:

根据[temp.param]/3

  

type-parameter ,其标识符不遵循省略号,将其标识符定义为 typedef-name (如果使用{{声明) 1}}或class)...在模板声明的范围内。

所以它就像typename一样。

然后[class.name]/5

  

如果在需要 class-name 的地方使用了名为 cv-qualified 类类型的 typedef-name ,那么 将被忽略。

因此GCC是正确的,typedef在继承const时应该被删除,因为 class-name 是必需的at that point,以及using T::T; 继承构造函数声明。