【问题标题】:Which part of the C++ standard covers calling a method via a null pointer?C++ 标准的哪一部分涵盖了通过空指针调用方法?
【发布时间】:2017-03-03 04:37:02
【问题描述】:

Stack Overflow 上有很多问题解释了以下是 C++ 中未定义的行为:

MyType* p = nullptr;
p->DoSomething();

但我找不到引用 C++ 标准的。 C++11 和/或 C++14 标准的哪一部分说这是未定义的行为?

【问题讨论】:

    标签: c++ standards


    【解决方案1】:

    C++14 [expr.ref]/2:

    表达式E1->E2被转换成等价形式(*(E1)).E2

    C++14 [expr.unary.op]/1:

    一元* 运算符执行间接:应用它的表达式应该是一个指向对象类型的指针,或者是一个指向函数类型的指针,结果是一个引用对象的左值表达式指向的函数

    指针不指向对象,因此这句话没有定义*p 的行为。标准中的其他地方也没有定义它,所以它是未定义的行为。

    关于空指针是否可以说是指向一个对象,N4618 [basic.compound]/3 将指针值定义为:

    指针类型的每个值都是以下之一:

    • 指向对象或函数的指针(据说该指针指向对象或函数),或
    • 超过对象末尾的指针,或
    • 该类型的空指针值,或
    • 一个无效的指针值。

    表示空指针值不指向对象。

    【讨论】:

    • 谢谢。尽管这是一个合理的假设,但是否有某种语言说空指针不指向对象?我也很惊讶这没有被明确称为未定义,这在标准中很典型。
    • @jacobsa 文本“对象指针类型的有效值表示内存中字节的地址 (1.7) 或空指针 (4.10)。”表明空指针值不是内存中字节的地址(因此不能是对象的地址)
    • 不错的发现;将其添加到答案中。
    • 谈到引用,在 8.3.2.5 "... 创建这样一个引用的唯一方法是将它绑定到通过空指针间接获得的“对象”,这会导致 undefined行为。”
    • 这句话不是在谈论运算符可以应用于的表达式类型,而不是它的允许值集吗? “指向对象类型的指针”不是指向有效对象的指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2013-01-21
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多