C ++标准的哪一部分包括通过空指针调用方法?

时间:2017-03-03 04:37:02

标签: c++ standards

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

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

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

1 个答案:

答案 0 :(得分:4)

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

  

表达式TypeError: not enough arguments for format string将转换为等效形式E1->E2

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

  

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

指针不指向对象,因此该引用不定义*的行为。标准中的任何其他地方都没有定义它,因此它是未定义的行为。

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

  

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

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

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