2013-07-05 15 views
13

Các Clang documentation gọn gàng giải thích rằngTrình tạo mặc định do người dùng khai báo + bộ khởi tạo trong lớp! = Constructor do người dùng cung cấp?

Nếu một lớp hoặc struct không có người dùng định nghĩa constructor mặc định, C++ không cho phép bạn để mặc định xây dựng một trường hợp const của nó như này ([dcl.init] , p9)

Lý do là nếu đối tượng const không được khởi tạo chính xác thì không thể thay đổi sau này. Các mã sau đây chỉ có một tuyên bố constructor mặc định user- cho Test, nhưng tất cả các thành viên của nó có initializers trong lớp,

#include<iostream> 

class Test 
{ 
public: 
    Test() = default; 
    void print() const { std::cout << i << "\n"; } 
private: 
    int i = 42; // will propagate to the default constructor! 
}; 

int main() 
{ 
    Test const t; // <-- Clang chokes on the const keyword, g++ does not 
    t.print(); // prints 42 
} 

nên lý do cho cũng do người sử dụng cung cấp constructor mặc định dường như không cần thiết đối với tôi . Và thực sự, g ++ 4.8.1 không biên dịch nó mà không có vấn đề (Online Example), mặc dù Clang < = 3.2 thì không.

Câu hỏi: tại sao sự kết hợp của bộ phận initalizers hoàn chỉnh + constructor mặc định do người dùng khai báo không đủ để mặc định xây dựng một đối tượng const? Có sửa chữa đang được tiến hành cho tiêu chuẩn C++ 14 không?

CẬP NHẬT: bất kỳ ai có thể thử trên Clang 3.3/3.4 để xem liệu điều này đã được khắc phục so với Clang 3.2 chưa?

+2

Tôi nghĩ đây là lỗi/lỗi trong Clang và g ++ là chính xác để chấp nhận mã. –

+0

@JerryCoffin Bất kỳ trích dẫn chuẩn nào để đi cùng với điều đó? Tôi hỏi vì không có bộ khởi tạo trong lớp, Standard cho biết Clang là đúng. – TemplateRex

+1

Không thực sự là một trích dẫn, nhưng bởi N3337, từ ngữ đã được thay đổi nên yêu cầu này đã biến mất. Cho rằng nó * là * trong tiêu chuẩn, tôi đoán gọi nó là một sai lầm hoặc lỗi có lẽ hơi không chính xác, nhưng tại thời điểm này tôi nghĩ hầu hết các trình biên dịch hầu hết là bỏ qua C++ 11 * cho mỗi * và theo đuổi các bản nháp mới hơn. –

Trả lời

11

Có, đây là sự cố đã biết. Xem http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#253. Nó chưa được sửa trong spec.

+0

+1 và được chấp nhận. Rất vui khi biết nó là trên radar. – TemplateRex

+0

Bạn có cơ hội truy cập vào Clang 3.3/3.4 để kiểm tra xem nó có còn là vấn đề không? – TemplateRex

+0

@TemplateRex Thật không may, với clang 3.4 (thân cây 184647) nó vẫn là một vấn đề. :( – Ali