Một đồng nghiệp hỏi về một số mã như thế này ban đầu có các mẫu trong đó.Tại sao tôi có thể gọi con trỏ hàm thành viên không phải là const từ một phương thức const?
Tôi đã xóa các mẫu, nhưng câu hỏi cốt lõi vẫn là: tại sao điều này biên dịch OK?
#include <iostream>
class X
{
public:
void foo() { std::cout << "Here\n"; }
};
typedef void (X::*XFUNC)() ;
class CX
{
public:
explicit CX(X& t, XFUNC xF) : object(t), F(xF) {}
void execute() const { (object.*F)(); }
private:
X& object;
XFUNC F;
};
int main(int argc, char* argv[])
{
X x;
const CX cx(x,&X::foo);
cx.execute();
return 0;
}
Cho rằng CX là một đối tượng const, và chức năng thành viên thực hiện là const, do đó bên CX :: thực hiện con trỏ này là const.
Nhưng tôi có thể gọi hàm không phải thành viên thông qua con trỏ hàm thành viên.
Chức năng thành viên có trỏ một lỗ được ghi chép trong cấu trúc của thế giới không?
Vấn đề gì (có lẽ là hiển nhiên đối với người khác) mà chúng tôi đã bỏ lỡ?
Tuy nhiên, với phương thức 'const', người ta chỉ có thể gọi các phương thức' const' trên các đối tượng thành viên, đúng không? –
Thành viên là tham chiếu, không phải là đối tượng được tham chiếu. –