表达式E是核心常量表达式,除非E的计算遵循抽象机器(intro.execution)的规则,将计算下列之一:
布局-新表达式不是常量表达式。
为了解决这个问题,C++20添加了std::construct_at。那么,为什么一个新的位置表达式不能成为一个常量表达式呢?
发布于 2022-10-14 00:09:58
放置-新表达式不是常量表达式,因为如果它们创建的对象没有被正确销毁,它们会调用未定义的行为。这是因为放置-新表达式绕过了正常的对象构造/破坏机制,而程序员则负责手动调用析构函数。如果要在常量表达式中创建对象,可以使用std::construct_at在给定地址初始化对象:
int main(int argc, char* argv[]) {
constexpr auto foo = []() {
auto buffer = std::array<int, 4>{};
return std::construct_at(buffer.data(), 1);
};
static_assert(foo() == 1, "!");
}https://stackoverflow.com/questions/73843218
复制相似问题