2

これは矛盾しているようです。Example::func の代わりに &Example::func を使用するのはなぜですか? Example::func または &exampleFunction の用途はありますか? 関数への参照を作成して、Example::func を除外することはできないようです。exampleFunction は既にポインターを返しているため、&exampleFunction を使用する方法は考えられません。

#include <iostream>
class Example {
public:
    void func() { std::cout <<"print me\n"; }
};
void exampleFunction() { std::cout << "print me too\n"; }
typedef void (Example::*ExampleFunc_t)(); 
typedef void (*ExampleFunction_t)();
int main()
{
    Example e;
    ExampleFunc_t     f  = &Example::func;
    ExampleFunction_t f2 = exampleFunction;
    (e.*f)();
    f2();
    return 0;
} 
4

2 に答える 2

6

それは、標準が関数へのポインターを定義する方法だからです。

実際には常にアドレス演算子を使用&して関数へのポインターを取得する必要がありますが、通常の関数と静的メンバー関数の場合、関数から関数へのポインターへの暗黙的な変換が標準で定義されています。

非静的メンバー関数の左辺値を取得できないため、これは (非静的) メンバー関数に対して定義されていません。

C++ 標準から:

4.3 関数からポインタへの変換

  1. 関数型 T の左辺値は、「T へのポインター」型の右辺値に変換できます。結果は関数へのポインタです。

脚注 52 付き:

非静的メンバー関数を参照する左辺値は取得できないため、この変換は非静的メンバー関数には適用されません。

一貫性の理由から &function のみを許可したいのですが、暗黙の変換は単に C 遺産の成果物だと思います...

于 2009-03-05T09:10:30.733 に答える