Меня только что поймала эта, казалось бы, невинная попытка вызвать конструктор std::string
который принимает размер и символьное значение, используя унифицированный синтаксис инициализации:
std::string s{ 10, '\0' };
Я думал, что это создаст строку длиной 10, инициализированную \0
.
Хотя на самом деле он вызывает конструктор, который принимает список инициализаторов и, таким образом, создает строку длиной 2, инициализированную {'\n', '\0'}
!
Есть ли способ избежать этой ловушки при использовании юниформ-инициализации? Или мне просто нужно быть осторожным?
Примечание. Похожий вопрос задавался ранее, но не было дано ответа о том, как этого избежать. ловушка.
TypeName(initializer_list<SomeType>);
), то он имеет приоритет над другими формами построения при условии, что список инициализаторов соответствует типу конструктора последовательности. - person clcto   schedule 11.05.2017[over.match.list]/1
; в принципе; конструкторы просматриваются в два этапа, и если какие-либо конструкторы списка инициализаторов вообще существуют, то это то, что вы получаете, к лучшему или к худшему. - person Lightness Races in Orbit   schedule 11.05.2017