gpt4 book ai didi

c++ - 未定义行为 (UB) 以实现余地为条件的程序是否为具有无条件 UB 的程序?

转载 作者:行者123 更新时间:2023-12-04 13:07:10 26 4
gpt4 key购买 nike

在回答中

表明程序可能具有未定义的行为“取决于”(本问题中的 des Pudels Kern)实现如何使用标准给出的实现余地。例如,[expr.prim.lambda.closure]/2 :

The closure type is declared in the smallest block scope, class scope,or namespace scope that contains the corresponding lambda-expression. [...]The closure type is not an aggregate type. Animplementation may define the closure type differently from what isdescribed below provided this does not alter the observable behaviorof the program other than by changing:

  • (2.1) the size and/or alignment of the closure type,
  • (2.2) whether the closure type is trivially copyable ([class.prop]), or
  • (2.3) whether the closure type is a standard-layout class ([class.prop]). [...]

在对答案的评论中指出,这种情况不是实现定义的行为

"implementation-defined" has a very specific meaning ([intro.abstract]/2); this isn't a case of that.

在这种实现余地条件下具有未定义行为 (UB) 的程序是否会具有无条件 UB,可能根据 [intro.abstract]/5 ?或者如何用标准术语描述这样的程序?

最佳答案

假设我正确理解了这个问题,这里有一个更简单的例子:

void* storage = ::operator new(100);
new (storage) std::string;

在某些语言实现中,当字符串适合内存时,将定义此示例程序的行为。但是该标准不保证任何语言实现都满足该假设,并且在假设不成立的语言实现中,行为是未定义的。

该行为有条件地未定义,具体取决于语言实现。这同样适用于问题中描述的更微妙的例子。


这不是“实现定义”的行为,因为标准并没有说它是使用那些引用的词的“实现定义”。如果标准确实这么说,那就意味着语言实现必须记录该行为。实际上,不需要记录闭包类型是否可简单复制。

为了避免这个短语具有特殊含义,我们可以使用诸如“依赖于实现”或“未指定”之类的替代词来描述这种情况。


如果您希望编写可移植到当前标准的任何语言实现的程序,包括您目前无法知道其实现的 future 存在的程序,您不应无条件地依赖此类实现细节。

您可以使用类型特征来观察闭包是否可平凡复制,并有条件地使用 std::bit_cast 仅当它格式正确且定义良好时 - 如果您有充分的理由这样做所以。

关于c++ - 未定义行为 (UB) 以实现余地为条件的程序是否为具有无条件 UB 的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68851113/

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