Các mã sau đây có thể được biên dịch mà không có lỗi:Tại sao `this` là một biểu thức phụ thuộc loại ngay cả khi lớp mẫu không có lớp cơ sở?
template <typename T> struct A {
void f() { this->whatever; } // whatever is not declared before
};
int main() {
A<int> a;
}
Và tôi biết đó là vì this
là một biểu thức kiểu phụ thuộc, mà làm cho tra cứu tên cho whatever
được hoãn lại cho đến khi mẫu đối số thực tế được biết đến. Vì hàm thành viên f()
không bao giờ được sử dụng trong trường hợp này, do đó không có instantiation nào của A<T>::f
tồn tại và tra cứu tên cho whatever
không bao giờ được thực hiện.
tôi có thể hiểu rằng this
là loại phụ thuộc nếu mẫu lớp có một loại phụ thuộc vào cơ sở như:
template <typename T> struct B { T whatever; };
template <typename T> struct A : B<T> {
void f() { this->whatever; }
};
int main() {
A<int> a;
}
Khi phân tích định nghĩa của lớp mẫu A
, nó không thể biết loại cơ sở của nó là những gì , làm cho this->whatever
có khả năng hợp pháp (B<T>
có thể có thành viên có tên whatever
). Ngược lại, tôi không thấy bất kỳ tiềm năng nào mà this->whatever
sẽ là hợp pháp trong ví dụ đầu tiên ngay sau khi hàm thành viên f
được sử dụng ở đâu đó.
Vì vậy, có thể this->whatever
là hợp pháp tại một số điểm trong ví dụ đầu tiên? Nếu không, có bất kỳ lý do nào khác mà this
nên được coi là biểu thức phụ thuộc vào loại trong trường hợp đó không?
Trong trường hợp của bạn, loại 'this' này sẽ luôn là' A * const' trong 'A :: f()'. Tôi không hiểu nhầm lẫn của bạn. –
@RSahu Tôi nghĩ câu hỏi đặt ra là tại sao ngôn ngữ định nghĩa 'this' là phụ thuộc vào kiểu trong bất kỳ ngữ cảnh mẫu nào, không chỉ là ngữ cảnh mà nó thực sự phụ thuộc vào kiểu. – templatetypedef
@RSahu Tôi có nghĩa là nếu 'this' không được coi là phụ thuộc vào loại trong trường hợp đầu tiên, không nên nó ít bị lỗi? Theo hiểu biết của tôi, một trong những lý do mà không phụ thuộc tên là tra cứu khi phân tích cú pháp định nghĩa của mẫu thay vì khi instantiating mẫu là để làm cho mã ít dễ bị lỗi. – Carousel