gpt4 book ai didi

c++ - 隐式对象创建是否适用于常量表达式?

转载 作者:行者123 更新时间:2023-12-05 01:54:45 25 4
gpt4 key购买 nike

#include <memory>

int main() {
constexpr auto v = [] {
std::allocator<char> a;
auto x = a.allocate(10);
x[2] = 1;
auto r = x[2];
a.deallocate(x, 10);
return r;
}();
return v;
}

程序格式错误吗? Clang 这么认为,GCC 和 MSVC 不这么认为:https://godbolt.org/z/o3bcbxKWz


删除 constexpr 我认为该程序没有错误格式并且具有明确定义的行为:

通过 [allocator.members]/5调用 a.allocate(10) 开始为其分配存储的 char[10] 数组的生命周期。

根据 [intro.object]/13开始 char 类型数组的生命周期在其存储中隐式创建对象

char 等标量类型是隐式生命周期类型。 ( [basic.types.general]/9

[intro.object]/10然后说 char 类型的对象在 char[10] 数组的存储中创建(并且它们的生命周期开始)如果这可以给程序定义的行为。

char 对象的生命周期没有从 x[2] 开始,没有 constexpr 的程序将有未定义的行为,因为写入到 x[2] 超出其生命周期,但 char 对象可以由于上述参数而隐式创建,从而使程序行为明确定义为退出状态 1


对于 constexpr,我想知道程序是否格式错误。隐式对象创建是否适用于常量表达式?

根据 [intro.object]/10隐式创建对象以赋予程序定义的行为,但格式错误是否算作定义的行为?

如果不是,则程序不应该是病式的,因为为 x[2] 隐式创建了 char 对象。

如果是,那么下一个问题是是否不确定程序是否格式错误,因为[intro.object]/10还说如果多个集合可以为程序提供定义的行为,则隐式创建哪些对象是未指定的。


从语言设计的角度来看,我希望隐式对象创建不应该发生在常量表达式中,因为验证一组对象是否存在使常量表达式有效对于一般的编译器来说可能是不可行的.

最佳答案

2469. Implicit object creation vs constant expressions

It is not intended that implicit object creation, as described in 6.7.2 [intro.object] paragraph 10, should occur during constant expression evaluation, but there is currently no wording prohibiting it.

关于c++ - 隐式对象创建是否适用于常量表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70556755/

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