Tôi sẽ chỉ thêm một chút chi tiết. Một mảng cơ bản của các std::initializer_list
hành vi tương tự như thời gian. Hãy xem xét các lớp sau:
struct X
{
X(int i) { std::cerr << "ctor\n"; }
~X() { std::cerr << "dtor\n"; }
};
và cách sử dụng của nó trong đoạn mã sau:
std::pair<const X&, int> p(1, 2);
std::cerr << "barrier\n";
Nó in ra
ctor
dtor
barrier
vì ở dòng đầu tiên, một thể hiện tạm thời của loại X
được tạo ra (bằng cách chuyển đổi hàm tạo từ 1
) và cũng bị hủy. Các tài liệu tham khảo được lưu trữ vào p
sau đó được treo lủng lẳng.
Đối với std::initializer_list
, nếu bạn sử dụng nó theo cách này:
{
std::initializer_list<X> l { 1, 2 };
std::cerr << "barrier\n";
}
sau đó, mảng bên dưới (tạm thời) tồn tại miễn là l
thoát. Do đó, đầu ra là:
ctor
ctor
barrier
dtor
dtor
Tuy nhiên, nếu bạn chuyển sang
std::pair<std::initializer_list<X>, int> l { {1}, 2 };
std::cerr << "barrier\n";
Đầu ra là một lần nữa
ctor
dtor
barrier
vì mảng bên dưới (tạm thời) chỉ tồn tại ở dòng đầu tiên. Hủy bỏ con trỏ đến các yếu tố l
sau đó dẫn đến hành vi không xác định.
Bản demo trực tiếp là đây .
std::pair
.