为什么以下代码可以正常工作?
void foo() {
cout << "Foo to you too!\n";
};
int main() {
void (*p1_foo)() = foo;
void (*p2_foo)() = *foo;
void (*p3_foo)() = &foo;
void (*p4_foo)() = *&foo;
void (*p5_foo)() = &*foo;
void (*p6_foo)() = **foo;
void (*p7_foo)() = **********************foo;
(*p1_foo)();
(*p2_foo)();
(*p3_foo)();
(*p4_foo)();
(*p5_foo)();
(*p6_foo)();
(*p7_foo)();
}
&
运算符:给定int p;
,&p
产生一个指向p
的指针并且是一个右值表达式;&
运算符需要一个左值表达式。 - James McNellis&*
的组合会相互抵消(6.5.3.2):“一元&
运算符返回它操作数的地址。” /--/ “如果操作数是一元*
运算符的结果,则既不评估该运算符也不评估&
运算符,结果就好像两者都被省略了一样,但是仍然适用于运算符的约束,并且结果不是左值。” - Lundin