使用constexpr构造函数的嵌套类,从非constexpr构造函数派生模板参数时合法吗?

时间:2018-04-26 20:10:36

标签: c++ visual-studio constexpr

template<typename T>
struct Outer
{   struct Inner : T
    {   constexpr Inner() {}
    }
    m;
};

struct NonConstexpr
{   NonConstexpr() {}
};

int main() { Outer<NonConstexpr> o; }

使用Visual C ++(2015年和2017年),结果为error C3615: constexpr function 'Outer<NonConstexpr>::Inner::Inner' cannot result in a constant expression

G ++和Clang都接受代码。这是Microsoft编译器中的错误吗?

编译器资源管理器: https://godbolt.org/g/SfZfMh

修改 为了澄清,如果我们将Inner设为模板,它就有效。但它有点难看。

template<typename T>
struct Outer
{   template<typename T_>
    struct Inner : T_
    {   constexpr Inner() {}
    };
    Inner<T> m;
};

1 个答案:

答案 0 :(得分:1)

[dcl.constexpr] / 4:

  

constexpr构造函数的定义应满足以下要求:...... function-body 应为= delete,或者它应满足以下要求...非委托构造函数,选择每个构造函数来初始化非静态数据成员和   基类子对象应该是constexpr构造函数。

由于NonConstexpr::NonConstExpr()不是constexpr,因此调用它的派生类构造函数Outer<NonConstexpr>::Inner::Inner()也不能为constexpr