为什么可以';我不能将this指针显式地传递给成员函数吗? > C++标准(ISO C++ 11)在第7.3.1段 >

为什么可以';我不能将this指针显式地传递给成员函数吗? > C++标准(ISO C++ 11)在第7.3.1段 > ,c++,c++11,this,C++,C++11,This,可以为其类的对象调用非静态成员函数 类型,或从其类派生的类(第10条)的对象 使用类成员访问语法(5.2.5、13.3.1.1)键入 使用g++(版本4.8.2)编译此代码的尝试 class-foo{ 公众: 空条(){ cout让我们将静态成员添加到类中,如下所示: class foo{ public: void bar() { cout<<"hey there"<<endl; } static void bar(f

可以为其类的对象调用非静态成员函数 类型,或从其类派生的类(第10条)的对象 使用类成员访问语法(5.2.5、13.3.1.1)键入

使用g++(版本4.8.2)编译此代码的尝试

class-foo{
公众:
空条(){
cout让我们将静态成员添加到类中,如下所示:

 class foo{
    public:
         void bar()     { cout<<"hey there"<<endl; }
         static void bar(foo*) { cout<<"STATIC MEMBER"<<endl; }
};
应该调用哪个函数?在这种情况下,您将如何调用这两个函数?语法是什么?如果您允许一个函数使用这种语法,您就必须放弃它(即语法)用于其他函数。标准决定使用foo::bar(&obj)
静态
成员函数的语法,而放弃非静态成员函数的语法


无论如何,如果您想将
&obj
作为参数传递给非静态成员函数,那么您可以使用
std::function
促进的类型擦除作为:

 void (foo::*pbar)() = &foo::bar; //non-static member function   #1

 std::function<void(foo*)> bar(pbar); 

 bar(&obj); //same as obj.bar();
void(foo::*pbar)(=&foo::bar;//非静态成员函数#1
标准:功能条(pbar);
bar(&obj);//与obj.bar()相同;
同样,您可以调用静态成员函数,如下所示:

 void (*pbar)(foo*) = &foo::bar; //static member function            #2

 std::function<void(foo*)> bar(pbar); 

 bar(&obj); //same as foo::bar(&obj);
void(*pbar)(foo*)=&foo::bar;//静态成员函数#2
标准:功能条(pbar);
bar(&obj);//与foo::bar(&obj)相同;
请注意,在第
#1
#2
行中,对象的类型
pbar
使编译器选择正确的成员函数-在第一种情况下,它使用指向非静态成员函数的指针,而在后一种情况下,它使用指向静态成员函数的指针


希望帮助。

Obj.Bar();这是标准,基本上C++允许它自己通过<代码>这个< /Cult>指针,不允许你这样做,以免出错。用适当的函数(<代码> Vo.0::Bo.[fo&t); >,你可以写<代码> Obj.bar(OBJ)
,但这看起来很傻。第5.2.5节的“类成员访问语法”指的是
E1.E2
E1->E2
语法,其中E1是对象,E2是成员名。要调用
bar()
,必须使用
obj.bar()
参数由编译器使用隐藏参数或CPU寄存器实现,它不是
bar()
的声明签名的公共参数,因此无法手动传递对象指针。
 void (foo::*pbar)() = &foo::bar; //non-static member function   #1

 std::function<void(foo*)> bar(pbar); 

 bar(&obj); //same as obj.bar();
 void (*pbar)(foo*) = &foo::bar; //static member function            #2

 std::function<void(foo*)> bar(pbar); 

 bar(&obj); //same as foo::bar(&obj);