С++ 11: строка (50, 'x') по сравнению с строкой {50, 'x'}

Как видно на ideone:

cout << string(50, 'x'); // xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
cout << string{50, 'x'}; // 2x

WAT??

Я понял, что 50 - это ASCII '2', поэтому:

cout << static_cast<int>('2'); // 50
cout << static_cast<char>(50); // 2

Но что у меня есть.

Это приводит к устойчивому аргументу против инициализаторов С++ 11?

Ответ 1

Когда вы выполняете string { 50, 'x' }, вы по существу инициализируете строку со списком символов.

С другой стороны, string(50, 'x') вызывает конструктор 2 аргументов, который определяется для повторения символа x 50 раз. Причина, по которой string { 50, 'x' } не выбирает конструктор, состоит в том, что он может быть неоднозначным. Что делать, если у вас тоже есть три конструктора параметров? Если тип имеет конструктор initializer_list, он будет выбран, если вы используете { ... } для инициализации.

В основном вам нужно знать о конструкторах вашего типа. Конструктор initializer_list всегда будет иметь приоритет, чтобы избежать двусмысленности.