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功能(即使它不应该像这样)?
std::basic_ostream::operator<<有两个超载bool和const void*; 请注意,没有重载功能指针.
Run Code Online (Sandbox Code Playgroud)basic_ostream& operator<<( bool value ); (6) basic_ostream& operator<<( const void* value ); (7)
对于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.所有其他值都成为现实.