Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C++中函数重载解析考虑静态调用的非静态成员函数? 我想知道为什么C++中函数重载解析在调用静态方法时会考虑非静态成员函数。_C++ - Fatal编程技术网

为什么C++中函数重载解析考虑静态调用的非静态成员函数? 我想知道为什么C++中函数重载解析在调用静态方法时会考虑非静态成员函数。

为什么C++中函数重载解析考虑静态调用的非静态成员函数? 我想知道为什么C++中函数重载解析在调用静态方法时会考虑非静态成员函数。,c++,C++,我已经阅读了文档,其中说明 如果任何候选函数是静态或非静态的成员函数,但不是构造函数,则将其视为具有一个额外的参数隐式对象参数,该参数表示为其调用的对象,并显示在第一个实际参数之前 考虑下面的代码。 struct A { static void foo(int a, float b){...} void foo(float a, int b){...} }; 那么调用A::foo1.f,1.f是不明确的 静态成员函数用于非静态函数调用的重载解析,这很有意义 A a; a.foo(1

我已经阅读了文档,其中说明

如果任何候选函数是静态或非静态的成员函数,但不是构造函数,则将其视为具有一个额外的参数隐式对象参数,该参数表示为其调用的对象,并显示在第一个实际参数之前

考虑下面的代码。

struct A {
   static void foo(int a, float b){...}
   void foo(float a, int b){...}
};
那么调用A::foo1.f,1.f是不明确的

静态成员函数用于非静态函数调用的重载解析,这很有意义

A a;
a.foo(1, 1.f); //can safely call static method
但是,在使用Class::function调用函数时,为什么还要考虑非静态成员函数呢?为什么编译器不能简单地选择静态void fooint a,float b

为什么编译器不能简单地选择静态void fooint a,float b

我对您的问题的理解是,由于非实例A::前缀,您假定语法A::foo是明确的。但看看这个场景:

struct A {
   static void foo(int, float);
   void foo(float, int);
};

struct B : A {
   // Hide the base class foo
   void foo()
   {
      // Now explicitly call it... this is ambiguous!
      A::foo(1.f, 1.f);
   }
};
因此,A::前缀可以引用静态和非静态成员函数,具体取决于上下文。编译器不能假定它只引用静态成员函数

还有更多的场景需要像::foo这样的限定非静态成员函数调用,例如在菱形继承结构中,如果不使用虚拟继承。这就是为什么任何成员函数都可以像这样调用,即使它是不必要的、没有意义的:A;a、 a::foo1,2.f

为什么编译器不能简单地选择静态void fooint a,float b

我对您的问题的理解是,由于非实例A::前缀,您假定语法A::foo是明确的。但看看这个场景:

struct A {
   static void foo(int, float);
   void foo(float, int);
};

struct B : A {
   // Hide the base class foo
   void foo()
   {
      // Now explicitly call it... this is ambiguous!
      A::foo(1.f, 1.f);
   }
};
因此,A::前缀可以引用静态和非静态成员函数,具体取决于上下文。编译器不能假定它只引用静态成员函数


还有更多的场景需要像::foo这样的限定非静态成员函数调用,例如在菱形继承结构中,如果不使用虚拟继承。这就是为什么任何成员函数都可以像这样调用,即使它是不必要的、没有意义的:A;a、 a::foo1,2.f

我90%肯定A是畸形的。你是什么意思?它应该编译得很好,没有模棱两可的调用。。。你说得对。我误认为您的示例具有完全相同的参数类型,对我来说,这是一天的结束。抱歉,A不是格式错误的。您可以使用class::syntax调用非静态成员。编译器无法仅从该语法就知道您调用的是静态函数还是非静态函数。您是对的!我不明白为什么我会得到这么多的反对票。对于有经验的C++开发者来说,这可能是个愚蠢的问题,但如果你不考虑继承,那就不是很明显了。我90%肯定A是伪造的。你是什么意思?它应该编译得很好,没有模棱两可的调用。。。你说得对。我误认为您的示例具有完全相同的参数类型,对我来说,这是一天的结束。抱歉,A不是格式错误的。您可以使用class::syntax调用非静态成员。编译器无法仅从该语法就知道您调用的是静态函数还是非静态函数。您是对的!我不明白为什么我会得到这么多的反对票。对于有经验的C++开发人员来说,这可能是个愚蠢的问题,但如果你不考虑继承,那就不是很明显了。