次のコードは、nullptr
ポインターと参照をいじっています。
#include <cstdio>
void printRefAddr(int &ref) {
printf("printAddr %p\n", &ref);
}
int main() {
int *ip = nullptr;
int &ir = *ip;
// 1. get address of nullptr reference
printf("ip=%p &ir=%p\n", ip, &ir);
// 2. dereference a nullptr pointer and pass it as reference
printRefAddr(*ip);
// 3. pass nullptr reference
printRefAddr(ir);
return 0;
}
質問: C++ 標準では、コメント付きステートメント 1..3 は有効なコードですか、それとも未定義の動作ですか?
これは、異なるバージョンの C++ と同じですか、それとも異なりますか (古いバージョンではもちろん、キーワード0
の代わりにリテラルが使用されます)。nullptr
おまけの質問: 既知のコンパイラ/最適化オプションはありますか?実際に上記のコードが予期しないことやクラッシュを引き起こす可能性がありますか? たとえば、nullptr
から参照引数を渡すことを含め、参照が初期化されるすべての場所で暗黙的なアサーションを生成するコンパイラのフラグはあり*ptr
ますか?
好奇心旺盛で、予期しないものがない場合の出力例:
ip=(nil) &ir=(nil)
printAddr (nil)
printAddr (nil)