Tôi gần đây đã làm việc trên một dự án C + + và đã đi qua một trường hợp cạnh với các nhà xây dựng chuỗi mà tôi không thể hiểu đầy đủ. Các mã có liên quan (trong đó you can run here) như sau:Tại sao mã này để khởi tạo một chuỗi ký tự đơn lẻ gọi hàm khởi tạo initializer_list?
#include <iostream>
#include <string>
using namespace std;
int main() {
string directParens(1, '*');
string directBraces{1, '*'};
string indirectBraces = {1, '*'};
cout << directParens.size() << endl; // 1
cout << directBraces.size() << endl; // 2
cout << indirectBraces.size() << endl; // 2
return 0;
}
Các phiên bản cú đúp-khởi tạo của chuỗi kết thúc có hai nhân vật trong đó, cụ thể là, một char
với giá trị số 1 theo sau là một ngôi sao.
Tôi không hiểu tại sao các phiên bản được khởi tạo bằng dấu ngoặc đơn của chuỗi gọi hàm dựng initializer_list
thay vì hàm tạo có kích thước và ký tự. Các nhà xây dựng initializer_list
có chữ ký này:
basic_string(std::initializer_list<CharT> init,
const Allocator& alloc = Allocator());
Cho rằng string
là một bí danh cho basic_string
char, chữ ký cụ thể sẽ là
string(std::initializer_list<char> init,
const Allocator& alloc = Allocator());
Làm thế nào là initializer {1, '*'}
, trong đó có yếu tố cả hai loại int
và loại char
, phù hợp với nhà xây dựng này? Tôi đã ấn tượng rằng tất cả các chữ trong một std::initializer_list
phải có cùng loại - đó có phải là không đúng?
Lưu ý, có một ngoại lệ cho thu hẹp chuyển đổi [cho biểu thức không đổi có kết quả sau khi chuyển đổi sẽ phù hợp với loại mục tiêu] (https://stackoverflow.com/a/26974911/1708801) –