15

コードからのclang 3.5.0およびgcc 4.9.1によって生成された実行可能ファイル

#include <iostream>

struct Foo
{
   Foo() { std::cout << "Foo()" << std::endl; }
   Foo(int x) { std::cout << "Foo(int = " << x << ")" << std::endl; }
   Foo(int x, int y) { std::cout << "Foo(int = " << x << ", int = " << y << ")" << std::endl; }
};

int main()                 // Output
{                          // ---------------------
   auto a = Foo();         // Foo()
   auto b = Foo(1);        // Foo(int = 1)
   auto c = Foo(2, 3);     // Foo(int = 2, int = 3)
   auto d = Foo{};         // Foo()
   auto e = Foo{1};        // Foo(int = 1)
   auto f = Foo{2, 3};     // Foo(int = 2, int = 3)
   auto g = Foo({});       // Foo(int = 0)          <<< Why?
   auto h = Foo({1});      // Foo(int = 1)
   auto i = Foo({2, 3});   // Foo(int = 2, int = 3)
}

コメントどおりに動作します。

cppreference から: cpp/language/list initialization :

[...]

T( { arg1, arg2, ... } )    (7)

[...]

タイプ T のオブジェクトのリスト初期化の効果は次のとおりです。

Tが集約型の場合、集約の初期化が実行されます。

それ以外の場合、braced-init-list が空でありT、デフォルトのコンストラクターを持つクラス型である場合、値の初期化が実行されます。

[...]

Foo({})デフォルトのコンストラクターを呼び出す必要があると結論付けました。

バグはどこ?

4

1 に答える 1