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_listhà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 psau đó đượ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à lthoá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ố lsau đó dẫn đến hành vi không xác định.
Bản demo trực tiếp là đây .
std::pair.