2016-04-13 11 views
3

これは単純化されたコードです:コンストラクタ、グラムでの初期化子リストと異なる行動++と打ち鳴らす

#include <vector> 

class VInitList 
{ 
public: 
    explicit VInitList(std::vector<int> v){} 
}; 

int main() 
{ 
    VInitList vil({{}}); 
} 

とg ++ 5.2.1でコンパイルし、このエラーを取得:

error: call of overloaded ‘VInitList(<brace-enclosed initializer list>)’ is ambiguous 
    VInitList vil({{}}); 
        ^
main.cpp:6:5: note: candidate: VInitList::VInitList(std::vector<int>) 
    VInitList(std::vector<int> v){} 
    ^
main.cpp:3:7: note: candidate: constexpr VInitList::VInitList(const VInitList&) 
    class VInitList 
     ^
main.cpp:3:7: note: candidate: constexpr VInitList::VInitList(VInitList&&) 

私が見ましたコンパイラのエラー{{}}を誤って書いたことがわかりましたが(私には意味がありません)、まだエラーを理解することはできません。 IMHOでは、コンパイラは余分な{}を取り除くか、構文エラーを返さなければなりません。意図したとおりに動作します

std::vector<int> v = {{{}}}; 

は、その後、私はこれをコンパイルしようとしました。

+0

私はあなたの例を見ていましたが、コードスニペットでコンパイルした余分なペアがあります。 – Henningsson

+0

g ++ 5.2.1ではコンパイルされませんが、Clang 3.7.0で行われます – FrankS101

+0

面白い質問あなたのシナリオでは、両方の場合で単一の '{}'で十分です。含まれる型は 'int'です、なぜ複雑ですか? :-) – iammilind

答えて

2

しかし、std::vector<int> v = {{{}}};はあなたの考えをしません。 0に初期化された1つのint要素でベクトルを初期化します。あなたが含まれているvector<int>が1つの要素、初期化した

VInitList vil{{{}}}; 
       ^-- int 
       ^-- vector<int> 
      ^-- VInitList 

を書いた場合、

std::vector<int> v = {{{}}}; 
         ^-- int 
         ^-- initializer_list<int> 
        ^-- vector<int> 

同様に:

int i{}; // assert(i == 0) 

のでstd::vector<int> v = {{{}}};のように解析されます。intリスト初期化することができるからですゼロにする。 (のコンストラクタはvector(initializer_list<int>)のコンストラクタがexplicitであるため、ステージを省略できます)。

VInitList vil({{}});

だからはとして解析することができる:

VInitList vil({{}}); 
       ^-- int 
       ^-- vector<int> 

又はvector 1つの要素を有する第一の場合には

VInitList vil({{}}); 
       ^-- vector<int> 
       ^-- VInitList 

として。後者の場合は空です。 gccがあなたのコードを拒否することも同様です。

Clangはこれを前者として解析します。どちらが正しいかわからない。

+0

非常に興味深い、私はintがリスト初期化できるか分からなかった。それはなぜ可能ですか?何のために? – FrankS101

+1

@ FrankS101の整合性は、主に、オブジェクトを "空"状態に初期化したい場合はどこでも '{}'や '= {}'を使うことができます。 C++ 98では '()'を関数宣言と混同しない場所で使用できることに注意してください。メンバ初期化子: 'struct S {int i; S():i(){}}; ' – ecatmur

関連する問題