【发布时间】:2017-03-03 04:37:02
【问题描述】:
Stack Overflow 上有很多问题解释了以下是 C++ 中未定义的行为:
MyType* p = nullptr;
p->DoSomething();
但我找不到引用 C++ 标准的。 C++11 和/或 C++14 标准的哪一部分说这是未定义的行为?
【问题讨论】:
Stack Overflow 上有很多问题解释了以下是 C++ 中未定义的行为:
MyType* p = nullptr;
p->DoSomething();
但我找不到引用 C++ 标准的。 C++11 和/或 C++14 标准的哪一部分说这是未定义的行为?
【问题讨论】:
C++14 [expr.ref]/2:
表达式
E1->E2被转换成等价形式(*(E1)).E2
C++14 [expr.unary.op]/1:
一元
*运算符执行间接:应用它的表达式应该是一个指向对象类型的指针,或者是一个指向函数类型的指针,结果是一个引用对象的左值 或表达式指向的函数。
指针不指向对象,因此这句话没有定义*p 的行为。标准中的其他地方也没有定义它,所以它是未定义的行为。
关于空指针是否可以说是指向一个对象,N4618 [basic.compound]/3 将指针值定义为:
指针类型的每个值都是以下之一:
- 指向对象或函数的指针(据说该指针指向对象或函数),或
- 超过对象末尾的指针,或
- 该类型的空指针值,或
- 一个无效的指针值。
表示空指针值不指向对象。
【讨论】: