为什么指向函数的指针等于1?

Afs*_*hin 3 c++ function-pointers implicit-conversion

检查以下代码:

#include <iostream>
using namespace std;

int& foo() {
    static int i = 0;
    return i;
}

int main() {
    cout << &foo() << endl;
    cout << &foo << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

正如你看到的,第一个cout返回值的打印地址foo(),这将是静态变量i里面foo().对于第二个cout我期待那&foo的回报地址foo()功能,如规定在这里:

2)如果操作数是非静态成员的限定名,例如&C :: member,则结果是指向成员函数的prvalue指针或指向类C中类型T的数据成员的指针.注意,&member和C都不是: :member甚至&(C :: member)可用于初始化指向成员的指针.

但令我惊讶的是,这是我的输出:

0x5650dc8dc174
1
Run Code Online (Sandbox Code Playgroud)

第一个是好的,但第二个是1?怎么回事?为了确保我没有弄乱任何东西,我在下面编写了这段代码C:

#include <stdio.h>

int foo() {
}

int main(void) {
    printf("%p", &foo);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下输出:

0x55732bd426f0
Run Code Online (Sandbox Code Playgroud)

它按预期工作.我错过了C++代码中的一些东西吗?或者这可能是因为内联foo功能(即使它不应该像这样)?

son*_*yao 6

std::basic_ostream::operator<<有两个超载boolconst void*; 请注意,没有重载功能指针.

basic_ostream& operator<<( bool value );        (6)   
basic_ostream& operator<<( const void* value ); (7)
Run Code Online (Sandbox Code Playgroud)

对于int*传递给它的函数指针和函数指针std::basic_ostream::operator<<,此处都需要隐式转换.

传递时int*,选择了(7)过载,因为隐式转换从转换int*const void*比所述一个转换为尤佳bool重载解析,

如果两个转换序列由于具有相同的排名而难以区分,则以下附加规则适用:

1)转换涉及指向bool的指针,指向成员的指针到bool,或std :: nullptr_t到bool转换比没有指针的转换更糟糕

任何(可选的cv限定的)对象类型T的prvalue指针都可以转换为prvalue指针(相同的cv-qualified)void.结果指针表示内存中与原始指针值相同的位置.

传递函数指针时,选择(6)过载; 函数指针可以隐式转换bool,但不能转换const void*.

可以将整数,浮点,无范围枚举,指针和指针到成员类型的prvalue转换为bool类型的prvalue.

零值(对于整数,浮点和未整数枚举)以及空指针和空指针到成员值将变为false.所有其他值都成为现实.