在尝试回答this问题时,我发现没有()
(调用“C ++最令人烦恼的解析”),g ++的输出是1
(可以在这里看到:{{3视觉工作室提供链接器错误的地方。我无法理解输出如何1
,任何线索?
答案 0 :(得分:6)
由于问题的答案已经解释,由于“最烦恼的解析”而不是使用两个str
来定义名为istream_iterators
的对象来指定其初始值设定项,因此将其解析为声明名为str
的函数,返回string
。
所以该程序的简单版本可以解析为 this online sample :
#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类型的右值。