Как узнать, вызывает ли инициализация списка конструктор std::initializer_list?C++

Программы на C++. Форум разработчиков
Anonymous
Как узнать, вызывает ли инициализация списка конструктор std::initializer_list?

Сообщение Anonymous »


Мой вопрос касается путаницы в инициализации членов класса по умолчанию в C++ между использованием списка инициализаторов и вызовом конструктора.

В языке нет двусмысленности, но возможна путаница в сознании разработчика, приводящая к неясным ошибкам. Знаете ли вы хороший способ обнаружить или избежать этой путаницы?

При объявлении переменной не возникает путаницы, поскольку при использовании initializer_list и вызове конструктора используются разные синтаксисы:

using block = std::vector; блок а{4, 5}; // скобки => список инициализаторов, 2 элемента, значения 4 и 5 блок б(4, 5); // круглые скобки => вызов конструктора, 4 элемента, все со значением 5 При вызове конструктора в инициализаторе члена по умолчанию вместо круглых скобок используются фигурные скобки. Однако, когда тип члена принимает initializer_list, это становится запутанным:

класс А { публика: A(размер целого числа, значение целого числа); }; класс С { публика: А а{4, 5}; // Вызов конструктора A(4, 5) блок б{4, 5}; // Список инициализаторов, а не вызов конструктора, хотя синтаксис тот же блок c{блок(4, 5)}; // Принудительный вызов конструктора, но неудобный синтаксис }; Путаница возникает из-за того, принимает ли тип элемента initializer_list или нет.

Знаете ли вы хороший способ справиться с этим?

Вернуться в «C++»