Исполняемые файлы, созданные 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:
[...] T( { arg1, arg2, ... } ) (7) [...]
Эффекты инициализации списка объекта типа T:
Если
T
является агрегатным типом, выполняется агрегатная инициализация.В противном случае, если список инициализации в фигурных скобках пуст и
T
является типом класса с конструктором по умолчанию, выполняется инициализация значения.[...]
Я пришел к выводу, что Foo({})
должен вызывать конструктор по умолчанию.
Где ошибка?
T
из списка-инициализации без скобок... было бы яснее? - person Casey   schedule 06.11.2014T({...})
не является инициализацией списка объекта типаT
, вместо того, чтобы добавить расплывчатую формулировку, которая может быть неверно истолкована. Cpprefreference уже не утверждает, что это так. Но с предложенным вами исправлением будет читаться, чтоT({...})
— это инициализация списка объекта типаT
из заключенного в скобки списка инициализации, что не так. Это инициализация списка любого параметра, который имеет выбранный конструктор. - person Johannes Schaub - litb   schedule 07.11.2014T({...}, {...}, ...)
(а также в случае функции и везде, где имеет смысл несколько списков, как это делается сarg1, arg2 ...
). Тогда, я думаю, его уже нельзя спутать с инициализацией списка объекта типаT
. - person Johannes Schaub - litb   schedule 07.11.2014T({args...})
- это инициализация списка. Он был указан (каламбур) в списке-инициализации страницу в качестве альтернативы 7 ситуаций, в которых выполняется инициализация списка. Я думаю, что чтение страницы ОП было точным. правильное исправление может заключаться в полном удалении элементов 5, 6 и 7 со страницы. - person Casey   schedule 07.11.2014T
. И действительно страница не утверждает, что это так. Так же, как не утверждается, что альтернатива 5 инициализирует функцию (возможно, здесь это более очевидно). - person Johannes Schaub - litb   schedule 07.11.2014T({...})
наU({...})
, чтобы избежать проблемы с текстом, относящимся кT
, что здесь неверно. - person Johannes Schaub - litb   schedule 07.11.2014Foo({2, 3})
вызываетFoo(int, int)
. - person precarious   schedule 07.11.2014