2013-05-14 63 views
6

Tôi gặp sự cố khi khởi tạo lớp có hằng số:gặp sự cố với constexpr

Tại sao khởi tạo con trỏ đến thành viên trong cùng một lớp dẫn đến lỗi? Lỗi xuất hiện mà không sử dụng lớp "Sử dụng"!

class A 
{ 
    private: 
     int a; 
     const int* const aptr; 

    public: 
     constexpr A(int _a): 
      a(_a) 
      , aptr(&a)   // why aptr could not be initialized? 
    {} 
}; 

class Data { } d1; 

class B 
{ 
    private: 
     Data* dptr1; 

    public: 
     constexpr B(Data* _p): dptr1(_p) {} 

}; 

class Use 
{ 
    static constexpr A a{2}; // fail! error: field initializer is not constant 
    static constexpr B b{&d1}; // works 
}; 
+0

@Morwenn: Vào thời điểm 'aptr' đang được xây dựng,' a' đã được tạo và có địa chỉ hợp lệ. – Mankarse

+0

Tôi bạn khởi tạo 'A' và' B' outisde của 'Use' với g ++, bạn nhận được' xin lỗi, unimplemented: sử dụng giá trị của đối tượng đang được xây dựng trong một biểu thức liên tục'. – Morwenn

+0

Tôi nghĩ rằng bạn có lỗi đánh máy hoặc UB ở đây: Bạn đang lấy địa chỉ của một tham số hàm, không tồn tại nữa sau khi hàm ctor của 'A' đã kết thúc. Có lẽ bạn muốn 'constexpr A (int & _a)'? – dyp

Trả lời

3

Mã hợp lệ và Clang chấp nhận mã đó; điều này có vẻ là một lỗi g ++. Địa chỉ của Use::a.a là một biểu thức liên tục địa chỉ, vì nó đánh giá đến địa chỉ của một đối tượng có thời gian lưu trữ tĩnh, vì vậy nó có thể được sử dụng để khởi tạo một đối tượng constexpr.

+0

Tôi nghĩ bạn có nghĩa là gcc.gnu.org/PR57694 –

+0

Xin lỗi, bạn đã đúng. Báo cáo lỗi là http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57694 – Klaus

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