小编Uni*_*rsE的帖子

UB 在未评估的上下文中(例如需要表达式)仍然是 UB 吗?

C++ 20草案[concept.default.init] 没有精确定义default_initializable

template<class T>
concept default_initializable = constructible_from<T> &&
    requires { T{}; } &&
    is-default-initializable <T>; // exposition-only
Run Code Online (Sandbox Code Playgroud)

并用以下词语描述is-default-initializable应该做什么:

对于 type Tis-default-initializable <T> 为真当且仅当变量定义

T t;

对于某些发明的变量 t 是良构的;否则为假。访问检查就像在与 T 无关的上下文中执行。仅考虑变量初始化的直接上下文的有效性。

cppreference 上,我们找到了以下可能实现的建议:

template<class T>
concept default_initializable = constructible_from<T> &&
    requires { T{}; } &&
    is-default-initializable <T>; // exposition-only
Run Code Online (Sandbox Code Playgroud)

使用nullptr参数调用的placement-new 运算符会导致未定义的行为。

9)由标准的单对象放置 new 表达式调用。标准库实现不执行任何操作并返回未修改的 ptr。如果通过放置 new 表达式调用此函数并且 ptr 是空指针,则行为未定义。

我现在的问题是:建议的可能实现实际上有效吗?一方面我认为不,因为涉及一个表现出未定义行为的表达式。另一方面,我认为是的,因为这个表达式出现在未评估的上下文中,因此可能不需要具有明确定义的行为(?),只需要在语法上有效。但我无法为其中一个找到明确的证据。

第二个问题:如果事实证明后者是真的,那么为什么这种新的布局满足标准要求的T t;必须是良构的?对我来说,这看起来像是一个奇怪的黑客,因为简单和复合需求都没有提供T t;精确需求的可能性。但为什么这样做呢?

c++ undefined-behavior language-lawyer c++-concepts

13
推荐指数
1
解决办法
170
查看次数