4
void f()
{}

void test()
{
    auto fn_1 = f;
    auto fn_2 = &f;

    assert(fn_1 == fn_2); // OK

    fn_1();      // OK
    fn_2();      // OK
    (*fn_1)();   // OK
    (*fn_2)();   // OK
    (**fn_1)();  // OK
    (**fn_2)();  // OK
    (***fn_1)(); // OK
    (***fn_2)(); // OK
}

これらの動作は C++ 標準で明示的に定義されていますか?

4

2 に答える 2

1

はい、アンパサンドはオプションです。同じ結果が得られます。

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

先に進んで、c++ 11を使用している場合、std::functionとにかく使用する必要がある場合は、はるかに理解しやすく、使用しやすいと言います。

于 2013-09-18T05:46:17.587 に答える
1

ここでの問題は、関数が関数ポインターに崩壊することです。変数fn_1との両方の型fn_2はですvoid (*)()。つまり、「引数を取らず、返す関数へのポインタvoid」です。の場合fn_1、関数は関数fへのポインタに減衰しますが、 の場合は、関数へのポインタfn_2を に明示的に代入し、fn_2減衰は発生しません。

于 2013-09-18T05:48:12.830 に答える