gpt4 book ai didi

c++ - 具有 constexpr 构造函数的嵌套类,从具有非 constexpr 构造函数的模板参数派生时是否合法?

转载 作者:行者123 更新时间:2023-11-30 05:02:07 26 4
gpt4 key购买 nike

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;
};

最佳答案

[dcl.constexpr]/4:

The definition of a constexpr constructor shall satisfy the following requirements: ... either its function-body shall be = delete, or it shall satisfy the following requirements ... for a non-delegating constructor, every constructor selected to initialize non-static data members and base class subobjects shall be a constexpr constructor.

NonConstexpr::NonConstExpr()不是 constexpr , 派生类构造函数 Outer<NonConstexpr>::Inner::Inner()它不能是constexpr要么。

关于c++ - 具有 constexpr 构造函数的嵌套类,从具有非 constexpr 构造函数的模板参数派生时是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50051114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com