首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么位置-新表达式不能是一个常量表达式?

为什么位置-新表达式不能是一个常量表达式?
EN

Stack Overflow用户
提问于 2022-09-25 08:56:51
回答 3查看 389关注 0票数 15

根据[expr.const]/5.18

表达式E是核心常量表达式,除非E的计算遵循抽象机器(intro.execution)的规则,将计算下列之一:

  • 一个新的表达式(expr.new),除非所选的分配函数是一个可替换的全局分配函数(new.delete.single,new.delete.array),并且所分配的存储被解除在E的计算范围内;

布局-新表达式不是常量表达式。

为了解决这个问题,C++20添加了std::construct_at。那么,为什么一个新的位置表达式不能成为一个常量表达式呢?

EN

Stack Overflow用户

发布于 2022-10-14 00:09:58

放置-新表达式不是常量表达式,因为如果它们创建的对象没有被正确销毁,它们会调用未定义的行为。这是因为放置-新表达式绕过了正常的对象构造/破坏机制,而程序员则负责手动调用析构函数。如果要在常量表达式中创建对象,可以使用std::construct_at在给定地址初始化对象:

代码语言:javascript
复制
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, "!");
}
票数 -2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73843218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档