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

时间:2012-04-06 06:30:20

标签: c++ visual-studio compiler-construction g++

在尝试回答this问题时,我发现没有()(调用“C ++最令人烦恼的解析”),g ++的输出是1(可以在这里看到:{{3视觉工作室提供链接器错误的地方。我无法理解输出如何1,任何线索?

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类型的右值。