std::string
имеет конструктор, который принимает аргумент initializer_list
.
basic_string(std::initializer_list<CharT> init,
const Allocator& alloc = Allocator());
Этот конструктор всегда получает преимущество при использовании рамно-Init-лист построить std::string
. Другие конструкторы рассматриваются только в том случае, если элементы в списке braced-init-list не конвертируются в тип элементов в initializer_list
. Это упоминается в [over.match.list]/1.
Первоначально функции кандидаты являются инициализатор-список Конструкторы ([dcl.init.list]) класса T
и список аргументов состоит из списка инициализации в качестве единственного аргумента.
В вашем примере, первый аргумент 5
неявно конвертируются в char
, поэтому initializer_list
конструктор жизнеспособна, и она будет выбрана.
Это видно при печати каждого символа в строках, как int
сек
void print(char const *prefix, string& s)
{
cout << prefix << s << ", size " << s.size() << ": ";
for(int c : s) cout << c << ' ';
cout << '\n';
}
string str1 {"aaaaa"};
string str2 {5, 'a'};
string str3 (5, 'a');
print("str1: ", str1);
print("str2: ", str2);
print("str3: ", str3);
Выход:
str1: aaaaa, size 5: 97 97 97 97 97
str2: a, size 2: 5 97
str3: aaaaa, size 5: 97 97 97 97 97
Live demo
"Uniform" инициализации ... –