【问题标题】:Runtime behavior with "C++ most vexing parse"“C++ 最令人头疼的解析”的运行时行为
【发布时间】:2012-04-06 06:30:20
【问题描述】:

在尝试回答this 的问题时,我发现没有()(它调用“C++ 最令人头疼的解析”),g++ 的输出是1(可以在这里看到:http://ideone.com/GPBHy),其中作为Visual Studio给出链接器错误。看不懂怎么输出1,有什么线索吗?

【问题讨论】:

  • 顺便说一句,你明白为什么 msvc 会出现链接错误而不是类似的行为吗?
  • @Als:据我了解,它尝试使用给定参数调用“函数”str,因为它找不到方法链接器给出错误。但是是的,我不知道为什么 g++ 没有给出同样的错误..
  • @Als:我最好的猜测是 MSVC 会尝试解析声明函数的地址,以便将值转换为 bool
  • @Asha:它不是调用函数,而只是解析函数的地址。 G++ 只是在编译时将函数地址转换为 true,而 MSVC 尝试在编译时解析函数地址,然后在运行时转换为 bool
  • @AndréCaron:好像是这样,让我吃惊的是,为什么会有这种处理方式的差异?这不是一个角落用例,一个小众的 IMO。

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


【解决方案1】:

正如问题的答案已经解释的那样,由于“最令人烦恼的解析”,该语句而不是使用两个 istream_iterators 定义名为 str 的对象来指定其初始化程序,而是将其解析为函数的声明命名为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

请注意,没有将std::ostream 和函数指针作为参数的重载operator &lt;&lt;,这是因为可以有任意数量的用户定义函数类型,当然标准的重载api 无法解释所有这些。

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

basic_ostream& operator<< (bool& val );

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


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

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

【讨论】:

  • 为什么投反对票?如果您觉得有问题,请注意添加评论或您自己的答案。郑重声明,这个答案没有错。
猜你喜欢
  • 1970-01-01
  • 2020-08-17
  • 2013-06-08
  • 2018-05-26
  • 2019-11-30
  • 2013-08-02
  • 2018-07-21
  • 1970-01-01
相关资源
最近更新 更多