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 ++标准明确定义?
答案 0 :(得分:1)
是&符号是可选的,它们产生相同的结果。
函数类型T的左值可以转换为“指向T的指针”的prvalue。结果是指向函数的指针.55
我要继续说,如果你使用c ++ 11,你应该使用std::function
无论如何它更容易理解和使用。
答案 1 :(得分:1)
这里的问题是函数衰减成函数指针。变量fn_1
和fn_2
的类型都是void (*)()
,即“指向函数的指针不带参数并返回void
”。在fn_1
的情况下,函数f
衰减为指向函数的指针,而在fn_2
的情况下,您明确地将函数的指针指定给fn_2
,并且不会发生腐朽。