Tôi hiện đang cố gắng hiểu khởi tạo đồng bộ mới của C++ 0x. Thật không may, tôi stumpled hơn bằng cách sử dụng đồng bộ khởi tạo tài liệu tham khảo. Ví dụ:Khởi tạo đồng bộ tài liệu tham khảo
int main() {
int a;
int &ref{a};
}
Ví dụ này hoạt động tốt:
% LANG=C g++ uniform_init_of_ref.cpp -std=c++0x -o uni -Wall -Wextra
uniform_init_of_ref.cpp: In function `int main()':
uniform_init_of_ref.cpp:3:10: warning: unused variable `ref' [-Wunused-variable]
(Cập nhật Comeau ném một lỗi ví dụ đó, như vậy có lẽ gcc nên không biên dịch nó là tốt)
Bây giờ, nếu tôi sử dụng loại dữ liệu tùy chỉnh thay vì số nguyên, nó không hoạt động nữa:
class Y
{};
int main()
{
Y y;
Y &ref{y};
}
% LANG=C g++ initialization.cpp -std=c++0x -o initialization -Wall -Wextra
initialization.cpp: In function `int main()':
initialization.cpp:9:13: error: invalid initialization of non-const reference of type `Y&' from an rvalue of type `<brace-enclosed initializer list>'
initialization.cpp:9:8: warning: unused variable `ref' [-Wunused-variable]
Thật không may, tôi không tìm thấy phần liên quan trong bản nháp tiêu chuẩn. tôi đoán là tôi hiểu lầm việc sử dụng khởi tạo thống nhất, như Comeau phàn nàn với tin nhắn này:
ComeauTest.c(9): error: reference variable "ref" requires an initializer
Y &ref{y};
Vì vậy, một người nào đó của bạn có thể chỉ cho tôi đi đúng hướng?
Trong trường hợp đó bạn muốn biết lý do tại sao câu hỏi này là có liên quan và lý do tại sao tôi không chỉ cần sử dụng Y &ref(y)
: Tôi muốn để có thể sử dụng khởi tạo thống nhất trong danh sách khởi tạo của một nhà xây dựng:
class X { };
class Y {
const X& x;
public:
Y (const X& xx):
x{xx}
{}
};
int main() {
X x;
Y y{x};
}
Điều này không thành công với thông báo lỗi như trên.
Lưu ý:
- Tôi đang sử dụng
LANG=C
để cho phép thông báo lỗi tiếng anh. - phiên bản gcc: 4.6.1
gcc 4.4.1 không biên dịch ví dụ đầu tiên: 'uniform_init_of_ref.cpp: 3: error: ISO C++ cấm sử dụng danh sách khởi tạo để khởi tạo tham chiếu ce 'ref'' – rmflow
@rmflow: gcc4.4 không đầy đủ thực hiện khởi tạo đồng bộ. –
Bạn có thể sử dụng thông thường 'x (xx)' trong danh sách khởi tạo hàm tạo của bạn, theo như tôi thấy không cần thiết cho công cụ đồng phục mới lạ :-) –