Ответ 1
Реальная проблема заключается в том, что API изменился.
Если конструктор был
Foo(int size, int value);
и вы использовали
Foo foo(10, 2);
и API был бы изменен на
Foo(int value, int size);
у вас будет такая же проблема.
В С++ 11, новый универсальный синтаксис инициализации также может использоваться для вызова обычного конструктора (который не принимает параметр initializer_list). Хотя, глядя, что это неплохо, я думаю, что это может вызвать проблемы в реальном мире.
Итак, предположим, что в моем проекте я использую библиотеку, которая поставляется со следующим классом:
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, и теперь автор решил добавить второй конструктор и что в равной степени вызывает инициализацию foo с помощью разных элементов не замечая.
Просто хотел узнать мнение других людей об этом. Это настоящая проблема, или я слишком переживаю? Есть ли решение предотвратить это? Благодарю.
Реальная проблема заключается в том, что API изменился.
Если конструктор был
Foo(int size, int value);
и вы использовали
Foo foo(10, 2);
и API был бы изменен на
Foo(int value, int size);
у вас будет такая же проблема.