"C++最烦恼的解析"的运行时行为

Ash*_*sha 4 c++ compiler-construction g++ visual-studio

在试图回答这个问题,我没有找到()(它调用"C++最棘手的解析")G ++的输出1(可以在这里看到:http://ideone.com/GPBHy),其中视觉工作室给出一个链接错误.我无法理解输出如何1,任何线索?

Alo*_*ave 6

随着问题的答案已经解释,由于"最棘手的解析"的说法,而不是定义一个名为对象str与两个istream_iterators指定其初始化,解析为命名函数的声明str,它返回一个string.

因此,该程序的简单版本解析为此在线示例:

#include<iostream>  

void doSomething()
{
} 
void (*ptr)()=&doSomething;

int main()
{

    std::cout << ptr << "\n"; 
    std::cout << doSomething;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

1
1
Run Code Online (Sandbox Code Playgroud)

请注意,没有重载operator <<将一个std::ostream和一个函数指针作为参数,这是因为可以有任意数量的用户定义的函数类型,并且当然标准重载的api不能解释它们全部.

鉴于编译器试图找到恰好存在的现有重载之间的最佳匹配bool(函数指针可隐式转换为bool[#1]).特别是,

basic_ostream& operator<< (bool& val );
Run Code Online (Sandbox Code Playgroud)

由于函数指针指向某个而不是null,因此该值打印为1.


[#1] C++ 03 4.12布尔转换

1算术,枚举,指针或指向成员类型的指针的右值可以转换为bool类型的右值.