下面的代碼周圍傻瓜與nullptr
指針和參考:nullptr是否在C++中引用未定義的行爲?
#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
關鍵字)?
獎金問題:有沒有已知的編譯器/優化選項,這實際上會導致上面的代碼做一些意想不到的事情/崩潰?例如,是否有任何編譯器的標誌,它會在引用初始化的任何地方生成隱式斷言,包括從*ptr
傳遞引用參數?
一個例子輸出爲好奇,沒有什麼意外:
ip=(nil) &ir=(nil)
printAddr (nil)
printAddr (nil)
空指針引用一直是UB。你有沒有搜索過? – sehe 2013-04-23 08:07:33
當你第一次解除引用ip時,你已經在(1)之前獲得了UB方式。 – Xeo 2013-04-23 08:07:42