【问题标题】:Reference to member function? [duplicate]引用成员函数? [复制]
【发布时间】:2011-11-06 21:46:08
【问题描述】:

我最近发现 C++ 中有一个函数引用的概念 :)。 因此存在指向函数和指向成员函数的不同类型。问题出现了。是否有“引用成员函数”的概念?

我尝试编译以下代码,但 GCC 3.4.6 报错。

#include <iostream>

using namespace std;

class A {
public:
  virtual void Af() const {
    cout << "A::Af()" << endl;
  }
};

int main() {
  typedef void (A::& MemFnc)() const;
  MemFnc mf = &A::Af;

  A a;
  (a.*mf)();

  return 0;
}

【问题讨论】:

  • gcc 3.4.6?您应该考虑更新编译器。此外,当询问触发编译器错误的代码时,最好提供实际的错误消息(从输出中的第一个错误开始)并确定编译器抱怨的行。
  • 我无权更新 GCC :(。我没有提供错误代码,因为我认为在这种情况下,它给出的错误类型无关紧要,重要的是它没有'不懂这个语法。
  • 如果要引用成员,应该使用哪种语法来使用它?指向成员的指针与.* 一起使用,因此常见用法表明对成员的引用应该只是删除星号,结果证明是简单的.?!这与使用普通成员完全一样。

标签: c++ function-pointers


【解决方案1】:

在 C++ 中没有所谓的对成员的引用

语言规范明确指出在注释中 (§8.3.3/3 - 2003),

指向成员的指针不应指向类 (9.4) 的静态成员、具有引用类型的成员或“cv void”。 [注:另见 5.3 和 5.5。 “指向成员的指针”类型与“指针”类型不同,即指向成员的指针仅通过指向成员声明符的指针语法声明,而从不通过指针声明符语法声明。 C++ 中没有“成员引用”类型。

【讨论】:

  • 从技术上讲,粗体中突出显示的内容并不规范,因为它只是一个注释。
  • @Charles:是的。我知道。但这很容易阅读和理解。这就是我引用它的原因。
  • 我的意思是,当您说“语言规范明确表示”时,这有点虚伪,因为规范没有明确表示“没有“引用成员”类型,它只是省略了提供一个。
  • @Charles:但注释被描述为“信息丰富”。因此,它们必须是真实的,否则它们不会提供信息,它们会提供错误信息;-) 只有在存在细微的头发分裂或语言使用不一致的情况下,您才需要使用注释是主要段落的附属这一事实的标准。他们仍然是标准的一部分,所以他们所说的标准所说的。它只是提供信息而不是规范地说。标准明确这一点,但我想它没有明确定义它,只是隐含地定义它。
  • @SteveJessop:我并没有反对有用的引文(如果不是确定的),只是“语言规范明确说明”的前缀没有任何限定,我觉得这有点误导。信息性注释不是语言规范本身的一部分,只是对解释的帮助。
【解决方案2】:

不,不能引用成员函数。

在某种意义上,取消引用指向成员函数的指针的结果可以作为一个结果,但是 only 你可以用这个结果做的事情是在它上面调用一个函数调用运算符,每5.5[expr.mptr.oper]/6。其他都不允许。

【讨论】:

    【解决方案3】:

    没有对成员函数的引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多