Как узнать, вызывает ли инициализация списка конструктор std::initializer_list? ⇐ C++
-
Anonymous
Как узнать, вызывает ли инициализация списка конструктор std::initializer_list?
Мой вопрос касается путаницы в инициализации членов класса по умолчанию в 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++ между использованием списка инициализаторов и вызовом конструктора.
В языке нет двусмысленности, но возможна путаница в сознании разработчика, приводящая к неясным ошибкам. Знаете ли вы хороший способ обнаружить или избежать этой путаницы?
При объявлении переменной не возникает путаницы, поскольку при использовании 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 или нет.
Знаете ли вы хороший способ справиться с этим?
Мобильная версия