看起来C ++标准目前阻止了普通的默认构造函数被constexpr(如果有任何非静态成员变量),因为一个简单的默认构造函数必须什么也不做,但是constexpr构造函数必须初始化所有东西。不幸的是,这会阻止该类型成为POD类型。
是否有任何解决方法允许类类型具有可以在constexpr代码中使用的默认构造函数而不使类非POD?
我可以通过向构造函数添加一个冗余参数来解决它,以便constexpr代码可以使用非默认构造函数,但这似乎相当脏,特别是因为在我关心的情况下,初始化值是不必要的并且将会所有都写在后面的代码中,所以我更喜欢一个简单的默认构造函数。例如:
struct A {
int a;
// Non-default constructors necessitate an explicit default
// constructor if default constructor is to exist
constexpr A(int b) : a(b) {}
#if 1 // non-POD
// constexpr default constructor must initialize everything,
// but this makes A non-POD.
constexpr A() : a(0) {}
#else // Workaround
A() = default;
struct UnnecessaryClass {};
constexpr A(UnnecessaryClass) : a(0) {}
#endif
};
constexpr void someConstexprFunction(ClassThatADoesntKnowAbout& t) {
#if 1 // non-POD
A a; // I'd prefer this not be initialized yet,
#else // Workaround
A a(A::UnnecessaryClass());
#endif
t.initializeA(a) // because it's initialized here.
// It doesn't make a difference when it's run at compile-time,
// but the redundant initialization is rather unfortunate if it's
// done at run-time.
}
void someNonConstexprFunction() {
A *pa = new A[1000000]; // array is redundantly initialized in non-POD case
... // Other downsides of non-POD types, too
}
答案 0 :(得分:4)
Trivial构造函数不能是constexpr,因为使用普通构造函数初始化的结果是未初始化的值。
插图:在这种情况下,AVal的::值应该是什么?
struct A { int a; }
constexpr A a;
using AVal = std::integral_constant<int, a.a>;
没有答案。
答案 1 :(得分:0)
你不仅不能在constexpr
上下文中使用普通的构造函数,也不能简单地构造内置类型。
constexpr
评估实现了C ++的有限子集,其中不包含未初始化的值。所以他们是被禁止的。
问题可能不是很难获得POD课程,但POD并不能做你想要的。