8

構造体内の匿名構造体のブレースまたはイコールイニシャライザは、VS2013によって生成された出力では動作しません。コードがあります:Linux上でこのコマンドを使用して、匿名構造体のブレスイニシャライザがVS2013で動作しない

#include <iostream> 
#include <cstdint> 


struct S 
{ 
    struct 
    { 
     uint64_t val = 0; 
    }anon; 
}; 

int main() 
{ 
    S s; 
    S *a = new S; 

    std::cout << s.anon.val << std::endl; 
    std::cout << a->anon.val << std::endl; 

    return 0; 
} 

コンパイル:

g++ -std=c++11 def-init-anon-atruct.cpp -o def-init-anon-atruct 

(最適化フラグを追加すると、結果には影響しません)

期待される結果:

0 
0 

奇妙な。 VS2013でそれを実行すると、ガベージ値が得られます。 C++ 11の標準を実装するという点で、誰がこの問題に直面していますか?私はこれがGCCの過ちであると大いに疑う。

何か役に立たないVSコンパイラオプションとは関係がありますか? Windowsの拡張機能ですか?私はバグMSのために構造体のためのデフォルトのコンストラクタを作る必要がありますか?これは不合理です。

+1

http://stackoverflow.com/questions/1069621/are-members-of-a-c-struct-initialized-to-0-by-default – Ben

+0

私はこれがgccの過ちであることを非常に疑っています。 –

+0

インテルのコンパイラは、Microsoftのターゲットプラットフォームで言語の適合性が向上しています。 – Potatoswatter

答えて

2

ネストされた匿名の構造体で静的に無視される非静的データメンバの初期化子は、Visual C++ 2013の場合はconfirmed bug、Visual C++ 2015 RTMの場合はfixedです。

6

MSが作成したバグのために、構造体のデフォルトのコンストラクタを作成する必要がありますか?これは不合理です。

はい、いいえ、それは不合理ではありません。

コンパイラもプログラムであり、他にもいくつかのバグがあります。

ツールについての選択肢がない場合は、理論上の不条理なことにもかかわらず、ツールの制限事項で作業する必要があります。

関連する問題