2017-08-02 25 views
0

C++の以下のコード構造が-Wallオプションでもコンパイルエラーまたは警告を出さない理由を説明できません。対応するソースファイル、referencesTest.cppでC++での初期化されていない参照(externを使用して宣言されています)

#ifndef REFERENCES_TEST_HPP 
#define REFERENCES_TEST_HPP 

extern int &refToInt; 

#endif /* REFERENCES_TEST_HPP */ 

、我々は、基準が定義されている:

はintへの参照がそうようにexternを使用して宣言されreferencesTest.hppは、ヘッダファイルがあると言いますしかし、初期化されていないままに、私たちはそのような実行時にそれに値を代入しようとしている。

#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

してコンパイルする場合10

実行時にセグメンテーションフォルトでクラッシュしますが、コンパイラでエラー/警告が表示されないのはなぜですか? 私の控えめなことは、C++での参照は宣言されたときに常に初期化する必要があるということでした。 誰かが上記のコードコンパイラの理由を説明できますか?

答えて

0

これは未定義の動作です。異なるコンパイラはこれを扱う異なる方法を持っています。たとえば、Visual Studioはエラーを発生させました。

+0

こんにちはDevin ..あなたの返信をありがとう!これは標準のどこに記載されていますか? –

+0

標準では、未定義の動作については要件がありません。申し訳ありませんが、私は実際の文書を手に入れることができません。私はスタックオーバーフローに関するさまざまな記事からこの事実を知っています。 –

関連する問題