2016-11-17 12 views
11

Xem ví dụ này trong [class.base.init]/11Tại sao clang và g ++ in 0 cho a1.v và a2.v trong ví dụ này trong C++ 1z?

struct A { 
    A() = default;   // OK 
    A(int v) : v(v) { }  // OK 
    const int& v = 42;  // OK 
}; 
A a1;      // error: ill-formed binding of temporary to reference 
A a2(1);     // OK, unfortunately 

Cả kêu vang và g ++ biên dịch mã (kêu vang với một cảnh báo), nhưng tôi muốn hiểu tại sao họ lại in 0 cho các thành viên a1.va2.v? Xem demo.

+0

Nghiêm ngặt liên quan (gần như là dup): http://stackoverflow.com/questions/21481481/initializing-reference-member-variable-with-literal – edmz

Trả lời

12

Không quan trọng là chúng in 0.

Đối với a1, việc khởi tạo không đúng định dạng để bắt đầu. Đối với a2, bạn đang ràng buộc một tham chiếu đến một tạm thời để bạn kết thúc với một tham chiếu lơ lửng. Không có ý nghĩa đối với 0 - đó là bất kỳ bộ nhớ rác nào mà tham chiếu xảy ra để trỏ đến điểm đó. Một khi bạn đang vi phạm điều kiện tiên quyết, chương trình là hành vi không xác định.

Hành vi chưa xác định không được xác định. Không có lý do gì để mong đợi một hành vi cụ thể cho bản in. Ví dụ, gcc 7 in 32764 trong khi clang 4 in 32765. Tại sao? Tại sao không.

+0

@Barry Tôi nghĩ, bạn nên chính xác hơn về không xác định và không đúng định dạng hành vi. Khi chúng ta đang nói về các tiêu chuẩn mới, cả a1 và a2 rõ ràng là không đúng định dạng, hãy kiểm tra DR 1696. – overseas

+0

@Barry [class.temporary]/5 (5.1) từng là: 'Một ràng buộc tạm thời với một thành viên tham chiếu trong một hàm tạo ctor-initializer (12.6.2) vẫn tồn tại cho đến khi constructor thoát khỏi, trong C++ 14. Nhưng điểm bullet này không còn tồn tại trong [\ [class.temporary \]/6] (http://eel.is/c++draft/class.temporary#6). –

+0

@overseas Tôi không hiểu bình luận của bạn. 'a1' bị hình thành không đúng, như tôi đã nói,' a2' không bị hình thành. Câu hỏi này sử dụng ví dụ từ báo cáo lỗi đó, bản thân nó chỉ ra rằng 'a2' không bị hỏng. – Barry

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