Предположим, что у меня есть класс:
class Foo
{
public:
Foo(int something) {}
};
И я создаю его с помощью этого синтаксиса:
Foo f{10};
Затем я добавлю новый конструктор:
class Foo
{
public:
Foo(int something) {}
Foo(std::initializer_list<int>) {}
};
Что происходит со строительством f
? Я понимаю, что он больше не будет вызывать первый конструктор, а вместо этого вызывает конструктор списка инициализации. Если это так, это кажется плохим. Почему так много людей рекомендуют использовать синтаксис {}
над ()
для построения объекта при добавлении конструктора initializer_list позже, может сломаться без проблем?
Я могу представить себе случай, когда я строю rvalue с использованием синтаксиса {}
(чтобы избежать наиболее неприятного разбора), но потом кто-то добавляет конструктор std::initializer_list
к этому объекту. Теперь код ломается, и я больше не могу его строить, используя rvalue, потому что мне нужно будет вернуться к синтаксису ()
, и это вызовет самый неприятный синтаксический анализ. Как бы справиться с этой ситуацией?