10

次のコンパイラ エラーに驚いています。

template <typename T>
struct A
{
    A(T t): t_{t} {}

    T t_;
};

struct S
{
};

int main()
{
    A<S> s{S{}};
}

エラーは(clangで):

test.cpp:4:16: error: excess elements in struct initializer
    A(T t): t_{t} {}
               ^
test.cpp:15:10: note: in instantiation of member function 'A<S>::A' requested here
    A<S> s{S{}};
         ^

GCC でも同様のエラーが発生します。

式がからt_{t}構成をコピーしようとすることを期待します。暗黙的に生成されたコピー コンストラクターがあるため、これが問題になることはないと思います。t_tS

誰かがここで何が起こっているのか説明できますか?

4

1 に答える 1

17

S暗黙的に生成されたコピーコンストラクターを持つ場合がありますが、それSは別のものでもあります。集合体。したがって、(ほとんど) を使用する{}と、集計の初期化が実行されます。したがって、の内容は{}、集合体のメンバーの値であることが期待されます。そして、あなたの集合体は空なので...ブーム。

テンプレート コードでは、まさにこれらの理由から、統一された初期化構文を避ける必要があります。不明なタイプTの場合、何が行われるか正確にはわかり{...}ません。

于 2013-02-20T22:13:40.717 に答える