2014-11-21 3 views
4

Как видно на ideone:C++ 11: строка (50, 'х') в зависимости от последовательности {50, 'х'}

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 

Но это, насколько у меня есть.

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

+2

Конструктор 'initializer_list'' string' принимает список символов, поэтому. –

+1

([см. Соответствующую документацию.] (Http://en.cppreference.com/w/cpp/string/basic_string/basic_string)) –

+2

Чтобы ответить на последнюю строку: Нет, это не так. Это просто означает, что вы должны понимать, что они делают. – Cubic

ответ

6

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

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

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

+1

Не следует ли '{50, 'x'}' не конвертироваться в 'std :: initializer_list ' из-за сужения конверсии? –

 Смежные вопросы

  • Нет связанных вопросов^_^