std::string
có hàm tạo có đối số initializer_list
.
basic_string(std::initializer_list<CharT> init,
const Allocator& alloc = Allocator());
Đó constructor luôn được ưu tiên khi bạn sử dụng một chuẩn bị tinh thần-init-list để xây dựng std::string
. Các nhà xây dựng khác chỉ được xem xét nếu các phần tử trong braced-init-list không thể chuyển đổi thành loại phần tử trong các initializer_list
. Điều này được đề cập trong [over.match.list]/1.
Ban đầu, các chức năng ứng cử viên là các nhà thầu initializer-list ([dcl.init.list]) của lớp T
và danh sách đối số bao gồm các danh sách initializer như một đối số duy nhất.
Trong ví dụ của bạn, đối số đầu tiên 5
là mặc nhiên chuyển đổi thành char
, vì vậy các nhà xây dựng initializer_list
là khả thi, và nó được chọn.
Đây là điều hiển nhiên nếu bạn in mỗi nhân vật trong chuỗi như int
s
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);
Output:
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" khởi ... –