コードからの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({})
デフォルトのコンストラクターを呼び出す必要があると結論付けました。
バグはどこ?