2012-10-10 28 views
5

Mã sau sẽ không biên dịch. Tại sao?Không thể: con trỏ này làm đối số mặc định. Tại sao?

class A 
{ 
    int j; 
    void f(int i = this->j); 
} 

Chỉnh sửa, để làm rõ. Đây là những gì tôi đang cố gắng làm, sử dụng ít dòng mã hơn ...

class A 
{ 
    void f(int i){}; 
    void f(); 
    int j; 
}; 

void A::f() 
{ 
    f(j); 
} 
+2

Bạn còn đang cố gắng làm gì ở đây? –

+3

Vì cá thể không nằm trong phạm vi bên trong khai báo đối số ...? –

+2

"... Biểu thức có thể kết hợp các hàm có thể nhìn thấy trong phạm vi hiện tại, biểu thức không đổi và biến toàn cục. Biểu thức không thể chứa biến cục bộ hoặc biến thành viên lớp không tĩnh ..." –

Trả lời

6

Giá trị đối số mặc định bị ràng buộc tại thời gian biên dịch.

"này" chỉ được xác định tại thời gian chạy, vì vậy không thể sử dụng được.

Xem ở đây cho một lời giải thích đầy đủ hơn: Must default function parameters be constant in C++?

+0

nhưng tại sao C++ được thiết kế như thế này, các đối số mặc định phải bị ràng buộc ở thời gian biên dịch? ... – alexandreC

+0

@alexandreC đó là một câu hỏi khác. –

0

Những người khác đã nhận xét về lý do này không hoạt động. Từ một trong những nhận xét:

" ... Các biểu hiện có thể kết hợp chức năng mà có thể nhìn thấy trong phạm vi hiện, biểu thức hằng số, và các biến toàn cầu Khái niệm không thể chứa các biến cục bộ hoặc class- không tĩnh. thành viên biến ..."

Bạn có thể sử dụng optional để loại bỏ các chức năng thêm mặc dù tôi không chắc chắn đó là rõ ràng hơn:

void f(boost::optional<int> i = boost::none) { if(!i) i = j; ... }

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