默认情况下可以使用UB吗?

因此,我一直在阅读the C++ standard并来到[defns.undefined](在我正在阅读的C ++ 17草案中为3.27。请注意,尽管我在这里引用C ++ 17 ,我在other standards中发现了类似的措词-即未定义行为的定义。我注意到了这个措辞(强调我的意思):

  

注意:当本国际标准省略对以下内容的任何明确定义时,可能会出现未定义的行为:   行为或程序使用错误的构造或错误的数据

现在,考虑这个问题,这种说法很有意义。有点说,如果标准不为其提供行为,则它具有未定义的行为。似乎是在说,如果您做的事情超出了标准的范围,则标准无话可说。那是有道理的。

但是,这也很奇怪,因为我一直认为标准必须明确声明未定义行为。但是,这似乎意味着除非另有说明,否则我们应该假定未定义行为。

如果是这种情况,那么是否不会存在未定义行为的实例,这些实例是未定义行为,因为标准没有明确给出某些构造的行为?如果 这样的事情是可能的,那么有可能生成(仍将编译的)未定义行为的示例,该示例由于此措辞而为未定义行为,或者会属于此范围之内的任何事物由于某种原因无法建造吗?

yimao5788 回答:默认情况下可以使用UB吗?

  

如果是这种情况,那么是否会因为标准没有明确给出某种构造的行为而导致未定义行为的实例为未定义行为?

我认为这是正确的观点。如果标准“偶然地”省略了特定构造的行为规范,但是我们都知道“应该”定义得很好,那么它就是标准的缺陷,需要加以修复。另一方面,如果是“应该”为UB的结构,则该标准已经“正确”(尽管明确表示有好处)。

例如,如果对象的构造函数尚未开始执行或析构函数已完成,则标准未提及如果将typeid应用于多态类类型的左值会发生什么。因此,行为是不确定的。这也是“显然”的UB。因此没有问题。

,
  

是否有可能生成(仍将编译的)未定义行为的示例,由于该措辞,该示例为未定义行为

经典示例是通过空指针(CWG232)进行间接访问:

*(int*)nullptr;

[expr.unary.op] / 1表示,应用间接运算符的结果是一个左值,它表示运算符的参数指向的对象,而空指针不指向任何对象。因此,在参数未指向对象的情况下,通过省略行为的显式定义,通过空指针进行的间接访问就是UB。

本文链接:https://www.f2er.com/3092607.html

大家都在问