2014-10-26 21 views
6

Đây là mã từ WebKit:ý nghĩa của việc này [i] trong C++ là những gì mà không quá tải

class ExecState : public Register 
{ 
JSValue calleeAsValue() const { return this[JSStack::Callee].jsValue(); } 
... 
} 

JSStack::Calleeconst, Operator[] không được quá tải trong ExecState hoặc Register,

Vì vậy, cú pháp là những gì trong c + + của this[JSStack::Callee]?

+0

Bạn đã thử xóa mã đó khỏi mã và xem điều gì sẽ xảy ra? – Chantola

+4

Uhh đó không phải là một điều tốt. Nếu 'JSStack :: Callee' không đánh giá là 0, bạn có vấn đề lớn. Nếu có, bạn thực sự vẫn gặp vấn đề. – chris

+0

Đừng thử ở nhà? –

Trả lời

5

Vâng, this là con trỏ đến một ExecState và sử dụng toán tử con trỏ với con trỏ làm cho nó hoạt động như thể nó là một mảng. Tức là, biểu thức this[JSStack::Callee] truy cập một đối tượng là JSStack::Callee yếu tố cách xa this. Tất nhiên, điều này chỉ có thể hoạt động nếu phần tử là thành viên của một mảng các đối tượng ExecState.

Dưới đây là bản trình diễn nhanh độc lập về cách sử dụng "tính năng" này. Nói chung tôi khuyên bạn nên chống lại bằng cách sử dụng nó nhưng có thể có nhu cầu rất cụ thể, nơi nó được biết rằng một loại được sử dụng trong một mảng và truy cập là khả thi. Ví dụ, nếu kiểu được định nghĩa cục bộ, tất cả các sử dụng đã biết có thể được biết (tôi sẽ thêm một chú thích cho rằng giả định).

#include <iostream> 

class foo { 
    int d_value; 
public: 
    foo(int i): d_value(i) {} 
    int get(int i) const { return this[i].d_value; } 
}; 

template <typename T, int Size> 
int size(T(&)[Size]) { return Size; } 

int main() 
{ 
    foo f[] = { 9, 1, 8, 2, 7, 3, 6, 4, 5 }; 
    for (int i=0; i < size(f) - 2; ++i) { 
     std::cout << "f[" << i << "].get(2)=" << f[i].get(2) << '\n'; 
    } 
} 
+1

Kỹ năng này là một ma thuật thực sự đen ... –

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