有这个代码:
#include <iostream>
using namespace std;
int func()
{
cout << "func" << endl;
return 0;
}
int main()
{
void * p;
p = func;
cout << p << endl;
cout << func << endl;
return 0;
}
在 Visual Studio 2010 中,此代码编译良好并在两种情况下都输出一些地址。
问题 1. 是否存在允许您将函数(指向函数的指针?)转换为类型的隐式转换void *?
问题 2. 为什么在将函数作为参数传递给重载的 operator时,<<编译器会再次将函数(指向函数的指针?)转换为 type void *,而不是转换为bool?毕竟,有一个隐式转换允许您将指针转换为类型bool。
此代码不会在 Microsoft 语言扩展 () 禁用模式下编译gcc或MSVC
/Za。所以它不应该编译。好吧,为什么错误的 MSVC 代码以这种方式编译而不是其他方式 - 我认为它们的内部实现的细节。在标准兼容模式 (
/Za) 中,字符串导致 value 的转换
bool和输出1。据我了解,根据标准,不允许将指向代码的指针转换为指向数据的指针[特别是],因为在不同的平台上,这些指针可以有不同的长度。
所有可能的转换列表都在标准中;
void那里根本没有提到将函数指针转换为函数指针。最接近的是7.11/2:此规则允许您将指向对象的指针转换为指向 的指针
void,而不是指向函数的指针。