2013-10-13 13 views
6

"chúng ta có thể initializate đối tượng của một lớp mà chúng tôi vẫn chưa xác định bất kỳ nhà xây dựng sử dụng:.Sao chép constructor xoăn niềng răng khởi

  • khởi tạo
  • bản khởi tạo khởi
  • mặc định..

Ví dụ:

struct Work { 
     string author; 
     string name; 
     int year; 
    }; 

    Work s9 { "Bethoven", 
       "Symphony No. 9 in D minor, Op. 125; Choral", 
       1824 
      };     // memberwise initialization 

    Work currently_playing {s9}; // copy initialization 
    Work none {};     // default initialization 

Ngôn ngữ lập trình C++ 4th Ed. Chương 17.3.1

Ví dụ:

struct Data 
    { 
     int mMember1; 
     float mMember2; 
     char mMember3; 
    }; 

    int main() 
    { 
     Data aData_1{1,0.3,33}; 
     Data aData_2{aData_1}; 

     return EXIT_SUCCESS; 
    } 

này phải làm việc, mặc dù tôi nhận được một lỗi biên dịch càng nhiều với GCC như với Clang. Lỗi là "không thể chuyển đổi dữ liệu thành int" trong cả hai trình biên dịch. Tuy nhiên, việc triển khai constructor sao chép lỗi này biến mất hoặc không có implenting nó nhưng sử dụng cú pháp dấu ngoặc tròn. Vấn đề là một chút ngu ngốc và thay đổi xoăn cho vòng niềng răng vấn đề được giải quyết. Nhưng tại sao các quy tắc của TC + + PL không được theo sau ?, là một vấn đề bộ compilator hay tôi hiểu lầm một cái gì đó ?. Cảm ơn trước.

+0

Điều này được cố định bởi DR thành C++ 14, [xem tại đây] (http://stackoverflow.com/questions/31776359/explicit-copy-constructor-and-uniform-initialization/31776937) –

Trả lời

9

Tôi nghĩ rằng hành vi phù hợp với 8.5.4 (Danh sách khởi tạo), câu 3:

List-khởi của một đối tượng hoặc tài liệu tham khảo của loại T được định nghĩa như sau:

- Nếu T là tổng hợp, khởi tạo tổng hợp được thực hiện (8.5.1).

[...]

- Ngược lại, nếu danh sách initializer có một yếu tố duy nhất của loại E [...] đối tượng hoặc tham chiếu được khởi tạo từ yếu tố đó;

Bạn đang mong mục thứ hai trong trích dẫn viết tắt của tôi áp dụng, nhưng mục đầu tiên được ưu tiên: Vì Data thực sự là tổng hợp, mệnh đề một phần tử không bao giờ được xem xét.


Trích dẫn của bạn từ sách có vẻ là known error. Ngôn ngữ được cho là sẽ được cố định để phù hợp với cuốn sách trong C++ 14.

+0

Tôi có chỉnh sửa thông điệp từ câu trả lời của bạn và tôi đã bao gồm mã trong cuốn sách. Trong mã này dường như được áp dụng hành vi thứ hai. – JoseLuis

+0

@JoseLuis Cuốn sách đơn giản là không chính xác. Nó có thể là ý định của các tác giả của đề xuất khởi tạo cú đúp rằng công việc này nhưng nếu vậy thì họ đã không xác định thành công điều này. – bames53

+0

@JoseLuis: Xem [errata] (http://www.stroustrup.com/4th.html), được cho là cố định trong C++ 14. –

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