Универсальная инициализация С++ 11 вызывает неожиданную инициализацию?

В С++ 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 с помощью разных элементов не замечая.

Просто хотел узнать мнение других людей об этом. Это настоящая проблема, или я слишком переживаю? Есть ли решение предотвратить это? Благодарю.

Ответы

Ответ 1

Реальная проблема заключается в том, что API изменился.

Если конструктор был

Foo(int size, int value);

и вы использовали

Foo foo(10, 2);

и API был бы изменен на

Foo(int value, int size);

у вас будет такая же проблема.