在尝试回答这个问题时,我发现没有()
(它调用“C++ 最令人烦恼的解析”),g++ 的输出是1
(可以在这里看到:http: //ideone.com/GPBHy),其中 Visual Studio 给出了链接器错误。我无法理解输出如何1
,有什么线索吗?
问问题
194 次
1 回答
6
正如问题的答案已经解释的那样,由于“最令人烦恼的解析”,该语句而不是定义一个以str
两者命名的对象istream_iterators
来指定其初始化程序,而是被解析为一个名为str
返回 a的函数的声明string
。
因此,该程序的一个简单版本解析为这个在线示例:
#include<iostream>
void doSomething()
{
}
void (*ptr)()=&doSomething;
int main()
{
std::cout << ptr << "\n";
std::cout << doSomething;
return 0;
}
输出:
1
1
请注意,没有operator <<
将一个std::ostream
和一个函数指针作为参数的重载,这是因为可以有任意数量的用户定义的函数类型,当然标准的重载 api 不能解释所有这些。
鉴于编译器试图在恰好是bool
(函数指针可隐式转换为bool
[#1])的现有重载中找到最佳匹配。尤其,
basic_ostream& operator<< (bool& val );
由于函数指针指向某物而不是null
,因此该值打印为1
。
[#1] C++03 4.12 布尔转换
1 算术、枚举、指针或指向成员类型的指针的右值可以转换为 bool 类型的右值。
于 2012-04-06T06:41:09.273 回答