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

时间:2013-09-18 05:40:39

标签: c++ c function pointers memory-address

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 个答案:

答案 0 :(得分:1)

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

  

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

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

答案 1 :(得分:1)

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