std::string
a hat Konstruktor, der ein initializer_list
Argument übernimmt.
basic_string(std::initializer_list<CharT> init,
const Allocator& alloc = Allocator());
Das Konstruktor immer Vorrang erhält, wenn Sie verwenden, um eine verspannt-init-Listestd::string
zu konstruieren. Die anderen Konstruktoren werden nur berücksichtigt, wenn die Elemente braced-init-list nicht in den Typ der Elemente in initializer_list
konvertiert werden können. Dies wird in [over.match.list]/1 erwähnt.
Anfänglich sind die Kandidaten Funktionen die Initialisierer-Liste Bauer ([dcl.init.list]) der Klasse T
und die Argumentliste besteht aus der Initialisiererliste als ein einziges Argument.
In Ihrem Beispiel das erste Argument 5
ist implizit konvertierbar char
, so dass der initializer_list
Konstruktor lebensfähig ist, und es gewählt wird.
Dies ist offensichtlich, wenn Sie
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);
Ausgang jedes Zeichen in den Streichern als int
s drucken:
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" Initialisierung ... –