2016-12-27 10 views
0
int main() { 
    struct WorkItem { 
    int node; 
    unsigned predecessorIndex = 0; 
    }; 

    auto x = WorkItem { 0 }; 

    return 0; 
} 

をフィールドを持つ構造体を初期化することはできません。このコードではなく、GCCと、クランと罰金コンパイル:はなぜMSVCとGCCはデフォルト値で

source_file.cpp: In function ‘int main()’:

source_file.cpp:9:25: error: no matching function for call to ‘main()::WorkItem::WorkItem()’ auto x = WorkItem { 0 }; ^

source_file.cpp:9:25: note: candidates are:

source_file.cpp:4:10: note: main()::WorkItem::WorkItem() struct WorkItem { ^

source_file.cpp:4:10: note: candidate expects 0 arguments, 1 provided

source_file.cpp:4:10: note: constexpr main()::WorkItem::WorkItem(const main()::WorkItem&)

source_file.cpp:4:10: note: no known conversion for argument 1 from ‘int’ to ‘const main()::WorkItem&’

source_file.cpp:4:10: note: constexpr main()::WorkItem::WorkItem(main()::WorkItem&&)

source_file.cpp:4:10: note: no known conversion for argument 1 from ‘int’ to ‘main()::WorkItem&&’

またはMSVC:

source_file.cpp(9): error C2440: 'initializing': cannot convert from 'initializer list' to 'main::WorkItem'

source_file.cpp(9): note: No constructor could take the source type, or constructor overload resolution was ambiguous

Clangは標準的な観点から、このコードを誤ってコンパイルしていますか、またはMSVCとGCCが間違っていますか? また、なぜ= 0を削除するとGCCとMSVCをコンパイルできますか?例えば。

int main() { 
    struct WorkItem { 
    int node; 
    unsigned predecessorIndex = 0; 
    }; 

    auto x = WorkItem { 0 }; 

    return 0; 
} 

GCCバージョン:4.9.3 クランバージョン:3.7.0 MSVCバージョン:デフォルトメンバ初期化子と19.00.24215.1

+0

すべてのオプションを含むcompileコマンド全体を表示します。 '-std ='オプションは特に結果に影響します。また、それはg ++の非常に古いバージョンです。 –

答えて

4

GCC version: 4.9.3

集合初期化GCC does not support until GCC 5.x C++ 14の特徴であります。

MSVC version: 19.00.23506

私は、これはデフォルトのメンバー初期化子と2015年の集計初期化がVC doesn't support until 2017 C++ 14の機能であるVCの更新1であると信じています。

+0

私はMSVCのバージョンが間違っています:19.00.24215.1が正しいです –

+1

つまり、C++ 11では 'WorkItem'は集合体ではなく、C++ 14です。 –

+0

@HBellamy:2015年のアップデート3です(年を指定して番号を更新した方が簡単です)バージョンを使用すると、その意味を調べなければなりません。 VCがこの機能を実装したのはまだVC 2017ではありません。 –

関連する問題