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;
};
答案 0 :(得分:1)
[dcl.constexpr] / 4:
constexpr构造函数的定义应满足以下要求:...... function-body 应为
= delete
,或者它应满足以下要求...非委托构造函数,选择每个构造函数来初始化非静态数据成员和 基类子对象应该是constexpr构造函数。
由于NonConstexpr::NonConstExpr()
不是constexpr
,因此调用它的派生类构造函数Outer<NonConstexpr>::Inner::Inner()
也不能为constexpr
。