4

在尝试回答这个问题时,我发现没有()(它调用“C++ 最令人烦恼的解析”),g++ 的输出是1(可以在这里看到:http: //ideone.com/GPBHy),其中 Visual Studio 给出了链接器错误。我无法理解输出如何1,有什么线索吗?

4

1 回答 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 回答