2013-06-17 27 views
25

Trong Các this con trỏ [class.this], C++ tiêu chuẩn quốc gia:Nếu `this` không phải là const, tại sao tôi không thể sửa đổi nó?

Loại this trong một hàm thành viên của một lớp X.

tức là this không phải là const. Nhưng tại sao nó thì đó

struct M { 
    M() { this = new M; } 
}; 

cho

error: invalid lvalue in assignment <-- gcc 
'=' : left operand must be l-value <-- VC++ 
'=' : left operand must be l-value <-- clang++ 
'=' : left operand must be l-value <-- ICC 
(source: some online compiler frontends) 

Nói cách khác, this không const, nhưng nó thực sự là!

+7

từ khoá 'this' không phải là một biến, do đó chúng tôi không thể nói rằng nó là hằng số hay không. –

+0

ngay cả khi điều này sẽ làm việc sau đó bạn chỉ có xây dựng một vòng lặp vô tận. –

+0

@vlad_tepesch: Hoặc là đệ quy vô hạn (như bạn có thể làm trong python). Tuy nhiên, đây không phải là câu hỏi. –

Trả lời

45

Vì trong cùng một đoạn, nó cũng được đề cập rằng thisprvalue ("giá trị thuần túy").

Ví dụ được đề cập trong tiêu chuẩn cho giá trị thuần túy là kết quả của việc gọi hàm không trả về tham chiếu hoặc các chữ như 1, true hoặc 3.5f. Con trỏ this không phải là biến, nó giống như một chữ cái mở rộng đến địa chỉ của đối tượng mà hàm được gọi là ([class.this]). Và giống như ví dụ đen true có kiểu boolkhôngbool const, this là loại và khôngX*const.

+3

@busy_wait Trong C++, các giá trị có một loại * và * một loại giá trị * Kiểu 'this' là' X * ', loại giá trị của nó là giá trị. Làm thế nào là không trực quan này? 'this' phải là một giá trị (' & this' không có ý nghĩa) - tại sao lại tạo kiểu 'X * const' khi nó không thể sửa đổi được? – Angew

+3

@Angew: Người ta phải thêm rằng có những ngôn ngữ mà 'this' (hoặc tương đương của nó) không phải là unmodifiable. Ví dụ. python: 'class X: def __init __ (self): self = X() s = X()' <- Điều này sẽ cho một 'chiều sâu recusion tối đa vượt quá' và không phải là một lỗi biên dịch. –

+0

Vì vậy, rõ ràng và súc tích +1. Tôi hiểu C++ nhiều hơn bây giờ :) (chủ yếu là giải thích về giá trị thuần túy). –

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