2
有堆棧溢出很多問題解釋,以下是用C未定義行爲++:C++標準的哪個部分涵蓋了通過空指針調用方法?
MyType* p = nullptr;
p->DoSomething();
,但我無法找到一個引用C++標準。 C++ 11和/或C++ 14標準的哪一部分表示這是未定義的行爲?
有堆棧溢出很多問題解釋,以下是用C未定義行爲++: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:
一元
*
操作者進行間接:至其所施加的表達應的指針的對象類型,或一個指向函數TY pe並且結果是左值,指的是對象或功能,表達式指向。
該指針不指向某個對象,因此該報價沒有定義*p
的行爲。標準中沒有其他地方定義它,所以它是未定義的行爲。
關於一個空指針是否可以說指向一個對象,N4618 [basic.compound]/3的指針值定義爲:
指針類型的每個值是下列值之一:
- 的指針的對象或函數(指針被說成指向對象或功能),或
- 指針過去的對象的端部,或
- 空指針值用於該典型值e或
- 無效的指針值。
它指示空指針值不指向對象。
謝謝。雖然這是一個合理的假設,但是有沒有一種說空指針並不指向對象的語言?我也很驚訝這不是明確地稱爲未定義的,這在標準中是典型的。 – jacobsa
@jacobsa文本「對象指針類型的有效值表示內存中的字節地址(1.7)或空指針(4.10)」。表明空指針值不是內存中字節的地址(因此它不能是一個對象的地址) –
很好找;將添加到答案。 – jacobsa