2016-03-31 4 views
3

このコード:gccとmsvcは、ユーザ提供コンストラクタのないconstオブジェクトを許可するのはなぜですか?これはバグですか?

class A { 
public: 
    A() = default; 
}; 

int main() 
{ 
    const A a; 

    return 0; 
} 

は、Visual C(VS 2015のアップデート2から)++とGCC(5.3.1)でエラーなしでコンパイルすることができますが、クランしてコンパイルすることができない、それはこのエラーを与える:

test.cpp:8:13: error: default initialization of an object of const type 
     'const A' without a user-provided default constructor 
      const A a; 
       ^
        {} 
1 error generated. 

右、clangまたはgccとMSVCは誰ですか? 他のコンパイラの動作はバグですか?

PS。 const A a{};は3つすべてでエラーなしでコンパイルされます。 空のコンストラクタ:A::A() {}を定義すると同じです。

PPS。これは複製ではありません。私は実際の質問を強調する。

更新 MSVCのバグに提出されました:https://connect.microsoft.com/VisualStudio/feedback/details/2538005 S.T.L.彼らはすべてをクランプテストに適合するように修正していると言いました:https://twitter.com/StephanTLavavej/status/715923311796953089

+0

なぜデフォルトコンストラクタをデフォルトに定義しますか?それがデフォルトで宣言されていない場合は、それを宣言して定義します。 –

+3

@AsierSánchezRodríguezできるので。これは質問ではありません。 – vladon

+0

@juanchopanza Fixed – vladon

答えて

2

gccはDR253に準拠しています。 gccは明示的にディフォルトデフォルトコンストラクタの存在を必要としないことWhy does gcc allow a const object without a user-declared default constructor but not clang?注:Aは関係なく、かどうかそこの、初期化されていないデータメンバーを持っているとき、それは、コードのコンパイルが可能になるという点で

struct A {}; // No uninitialized members 
int main() { 
    const A a; // OK with gcc 
} 

MSVCが非準拠であります明示的にディフォルトデフォルトコンストラクタがあるが、それは、少なくとも問題の診断(C4269)ないので、それを準拠させるのは簡単でなければなりません:

struct A { int i; }; // Uninitialized data member 
int main() { 
    const A a; // Should be ill-formed; MSVC accepts with diagnostic 
} 

main.cpp(8): warning C4269: 'a': 'const' automatic data initialized with compiler generated default constructor produces unreliable results

打ち鳴らすはpatch accepted and ready to land(2015年6月以来の)Bを持っていますそれは忘れられているようです。

+0

DR253はまだ標準化されていますか?最後に私は(10月15日)それに何の活動もなかったことを確認しましたが、それはまだ "作図中"の状態でした。 –

関連する問題