Рассмотрим код
#include <iostream>
class Foo
{
int val_;
public:
Foo(std::initializer_list<Foo> il)
{
std::cout << "initializer_list ctor" << std::endl;
}
/* explicit */ Foo(int val): val_(val)
{
std::cout << "ctor" << std::endl;
};
};
int main(int argc, char const *argv[])
{
// why is the initializer_list ctor invoked?
Foo foo {10};
}
Выходной сигнал
ctor
initializer_list ctor
Насколько я понимаю, значение 10
неявно преобразуется в Foo
(первый ctor
вывод), тогда конструктор инициализатора запускает (второй initializer_list ctor
вывод). Мой вопрос, почему это происходит? Не лучший ли стандартный конструктор Foo(int)
? Я., я ожидал, что вывод этого фрагмента будет просто ctor
.
PS: Если я отмечаю конструктор Foo(int)
как explicit
, тогда Foo(int)
является единственным вызванным конструктором, поскольку целое число 10
теперь не может быть неявно преобразовано в Foo
.