2011-07-01 36 views
18

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
+0

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

+2

@rmflow: gcc4.4 không đầy đủ thực hiện khởi tạo đồng bộ. –

+0

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ạ :-) –

Trả lời

6

Theo N2672 đoạn 8.5.4.4 nên nói:

Otherwise, if T is a reference type, an rvalue temporary of the type referenced by T is list-initialized, and the reference is bound to that temporary. [ Note: As usual, the binding will fail and the program is ill-formed if the reference type is an lvalue reference to a non-const type. ]

đó (nếu tôi hiểu nó một cách chính xác) có nghĩa là khởi tạo thống nhất tài liệu tham khảo liên kết họ mới trường hợp ẩn danh, vì vậy có vẻ như với tôi nó khá vô dụng. Điều đó vẫn không giải thích tại sao một người làm việc và người kia thì không; họ nên hành xử giống nhau (trừ khi Y có một số nhà thầu rõ ràng).

+0

Vì vậy, trong ví dụ đầu tiên, làm 'ref = 42' sẽ ** không ** sửa đổi' a'. –

+0

@ alexandre-c gán cho 'ref' trong ví dụ đầu tiên thay đổi giá trị của' a' ở đây. – evnu

+0

@evnu: hành vi này không phù hợp với dấu @Jan. Bạn đã kiểm tra với Comeau chưa? –

Các vấn đề liên quan