В C++ 11, новый универсальный синтаксис инициализации также можно использовать для вызова обычного конструктора (который не принимает параметр initializer_list). Хотя, глядя, что это неплохо, я думаю, что это может вызвать проблемы в реальном мире.Универсальная инициализация C++ 11 вызывает неожиданную инициализацию?
Итак, пусть в моем проекте я использую библиотеку, которая поставляется со следующим классом:
class Foo
{
public:
Foo(int size, int value); // create 'size' number of elements
Foo(initializer_list<int> list); // create elements as in 'list'
}
В проекте используется таким образом:
Foo foo{10, 2}; // initialize foo with 2 elements: 10 and 2
Теперь библиотека получила новое релиз, а в новом выпуске автор удалил второй конструктор, который принимает файл initializer_list (либо по назначению, либо по ошибке). Я не заметил изменений, и мой проект строится счастливо, как и раньше, только с неожиданной инициализацией foo (теперь это 10 элементов вместо 2).
Другая версия этой проблемы состоит в том, что Foo имеет только 1-й конструктор, и вы используете универсальный синтаксис инициализации для init foo, и теперь автор решил добавить 2-й конструктор и что в равной степени вызывает инициализацию foo с помощью разных элементов, не замеченных.
Просто хотел узнать мнение других людей об этом. Это настоящая проблема, или я слишком переживаю? Есть ли решение предотвратить это? Благодарю.
Это, безусловно, хороший аргумент против того, чтобы считать его «универсальным» и пытаться использовать его повсеместно. Используйте правильное имя, «инициализацию списка» и используйте его только тогда, когда вы специально хотите инициализировать из списка. Или когда синтаксис заставляет вас, например, инициализацию в классе или во избежание досадного разбора. (Но это только мое мнение, а не ответ, так как на самом деле нет ответа.) –
Скотт Мейерс очень хорошо описывает это в Эффективном современном C++ в пункте 7, и да, это настоящая проблема. –
Очень крутой вопрос. Может ли кто-нибудь объяснить, почему скобки '()' разрешены для пропуска? – Chiel