2017-08-02 204 views
0

我無法解釋爲什麼C++中的以下代碼構造即使使用-Wall選項也未給出任何編譯錯誤或警告。C++中的未初始化引用(使用extern聲明)

說有一個頭文件,referencesTest.hpp,其中int的參考聲明使用的extern像這樣:

#ifndef REFERENCES_TEST_HPP 
#define REFERENCES_TEST_HPP 

extern int &refToInt; 

#endif /* REFERENCES_TEST_HPP */ 

在相應的源文件,referencesTest.cpp,我們則有定義的參考但未初始化,我們嘗試在運行時爲它分配一個值,像這樣:

#include "referencesTest.hpp" 

//Why no error/warning is raised here ? 
int &refToInt; 

int main() 
{ 
     int testVariable = 8; 

     //This crashes on run time with Seg fault but no compilation error/warnings. 
     refToInt = testVariable; 

     return 0; 
} 

當使用GCC編譯版本5.4.0

g++ -Wall referencesTest.cpp -o output 

它在運行時崩潰時出現分段錯誤,但爲什麼編譯器不會在此處引發任何錯誤/警告? 我的低估是,C++中的引用在聲明時總是需要初始化。 有人可以幫助解釋爲什麼上面的代碼編譯器?

回答

0

這是未定義的行爲。不同的編譯器會有不同的處理方式。例如,當我試圖做你所做的事情時,Visual Studio確實產生了錯誤。

+0

嗨德文..謝謝你的回覆!這是否提到了標準中的某些地方? –

+0

該標準對未定義的行爲沒有要求。對不起,我不能向你推薦實際的文件,因爲它需要花錢購買。我只是從堆棧溢出的各種帖子知道這個事實。 –