Tôi đã chơi với một số mã vô dụng để hiểu khởi của tài liệu tham khảo thành viên, và tình cờ gặp này:khởi của thành viên tham chiếu const trong danh sách initializer
struct A {};
struct B
{
B() : a()
{
}
const A& a;
};
Đoạn mã trên cung cấp cho các lỗi sau khi biên dịch với gcc 4.9. 2:
In constructor 'B::B()':
error: value-initialization of reference type 'const A&'
B() : a()
Tôi hiểu điều này.
Nhưng nếu tôi sử dụng khởi tạo thống nhất trong danh sách initializer constructor của B, như vậy:
struct A {};
struct B
{
B() : a{}
{
}
const A& a;
};
Nó biên dịch tốt.
Vì vậy, câu hỏi là, tại sao việc sử dụng đồng bộ hóa khởi tạo ở đây thay đổi kết quả biên dịch?
Tôi cũng đã cố gắng này với Microsoft Visual C++ 2013. Nó không biên dịch hoặc phiên bản mã, với thông báo lỗi tương tự:
Error 3 error C2440: 'initializing' : cannot convert from 'int' to 'const A &
Bạn có thể có một vở kịch nhanh chóng với nó ở đây:
Khởi chạy đồng bộ là một tính năng tương đối mới và bạn phải mong đợi một số lỗi trình biên dịch với nó. Trong trường hợp này, không tìm kiếm nó, tôi đoán rằng trình biên dịch của Microsoft là chính xác. –
Đoán của tôi: '{}' được hiểu là lời gọi hàm khởi tạo mặc định của 'A' (giống như bạn đã làm' A a {}; '), do đó tạm thời' A {} 'được tạo. Sau đó nó được ràng buộc với const-ref và tuổi thọ của nó được mở rộng (như nếu bạn đã làm 'const A & a {}', cũng hoạt động trong GCC). Nhưng tôi không biết tiêu chuẩn nói gì về điều đó; nếu nó được cho phép ... Điều gì thực sự gây nhầm lẫn cho tôi là MSVC nhìn thấy một 'int' mà tôi không thể nhìn thấy ... Bạn đã thực sự biên dịch mã này? – leemes
@JamesKanze Tôi hiểu điều đó, nhưng tôi không muốn đi ra ngoài và hét lên lỗi trình biên dịch. Có lẽ có một cái gì đó về khởi tạo thống nhất mà tôi không biết và điều đó sẽ làm cho nó hoạt động khác nhau trong tình huống này. – Hugo