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 的指针”类型的纯右值。结果是指向函数的指针.55

我只是继续说,如果您使用 c++11,std::function无论如何您都应该使用它,它更容易理解和使用。

于 2013-09-18T05:46:17.587 回答
1

这里的问题是函数衰减为函数指针。两个变量的类型fn_1都是fn_2void (*)()即“指向不带参数并返回的函数的指针void”。在 的情况下fn_1,函数f衰减为指向函数的指针,而在 的情况下fn_2,您明确地将指向函数的指针分配给fn_2,并且不会发生衰减。

于 2013-09-18T05:48:12.830 回答