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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了继承自作为模板参数传递的const类型相关的知识,希望对你有一定的参考价值。

以下代码无效:

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>

答案

感谢@T.C.我们有:

[temp.param]/3说:

标识符不遵循省略号的类型参数将其标识符定义为typedef-name(如果使用classtypename声明)...在模板声明的范围内。

所以它就像typedef一样工作。

然后[class.name]/5

如果在需要类名的地方使用命名cv限定类类型的typedef-name,则忽略cv限定符。

因此GCC是正确的,const应该在继承T时被剥离,因为类名需要at that point,以及using T::T;继承构造函数声明。

以上是关于继承自作为模板参数传递的const类型的主要内容,如果未能解决你的问题,请参考以下文章

将模板化智能指针类型作为模板参数传递

将私有父类类型作为参数传递 (C2247)

临时变量作为非const的引用进行参数传递引发的编译错误

从std :: function中推导返回和参数类型作为模板函数参数传递?

我应该通过 const 引用传递一个 lambda。

模板特化和模板模板参数的问题