Как узнать, вызывает ли инициализация списка конструктор 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 или нет.

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

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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