函数地址和函数地址的地址之间没有区别吗?

5
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++标准中?

2
请查看这个答案 - raina77ow
函数调用 - Dayal rai
2个回答

1

是的,&符号是可选的,它们产生相同的结果。

T类型的函数lvalue可以转换为类型为“指向T的指针”的prvalue。结果是函数的指针。55

我只想说,如果你正在使用c++11,你应该使用std::function,因为它更容易理解和使用。


你能给我推荐一下权威标准吗? - xmllmx

1
这里的问题是函数会退化为函数指针。变量fn_1和fn_2的类型都是void (*)(),即“不带参数且返回void的函数指针”。fn_1中的函数f会退化为函数指针,而在fn_2中,您明确将一个函数指针赋给了fn_2,因此不会发生退化。请注意保留html标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接