1. ホーム
  2. c++

[解決済み] ヌル参照は可能ですか?

2022-03-11 21:17:29

質問

このコード片は有効か(動作が定義されているか)?

int &nullReference = *(int*)0;

を使用しても、g++とclang++の両方が警告なしでコンパイルします。 -Wall , -Wextra , -std=c++98 , -pedantic , -Weffc++ ...

もちろん、この参照はアクセスできない(NULLポインタを再参照することになる)ので、実際にはNULLではありませんが、そのアドレスをチェックすることで、NULLかどうか確認することができます。

if( & nullReference == 0 ) // null reference

解決方法は?

リファレンスはポインタではありません。

8.3.2/1:

参照は、以下のように初期化されなければならない。 有効なオブジェクトまたは関数を参照する。 [注:特に、NULL参照は 定義された なぜなら そのような参照を作成するには によって得られる「オブジェクト」にバインドする。 NULLポインタの参照解除を行う。 は、未定義の動作を引き起こします。このように 9.6で説明したように、参照は はビットフィールドに直接バインドされます。]

1.9/4:

その他の特定の操作については この国際規格では は未定義です(たとえば ヌルポインタの参照解除)

Johannes氏が削除された回答で述べているように、"dereferencing a null pointer"が未定義の動作であると断定的に述べるべきかどうかは疑問が残ります。しかし、NULLポインタは確かに有効なオブジェクトや関数を指していませんし、標準化委員会でもNULL参照を導入しようとは考えていませんので、これは疑問が生じるようなケースとは言えません。