当前位置:  开发笔记 > 编程语言 > 正文

C++编程谜语,功能指针很有趣

如何解决《C++编程谜语,功能指针很有趣》经验,为你挑选了1个好方法。

给出以下代码段:

#include 
#include 

int main()
{
    std::string prefix("->"), middle(), suffix("<-");
    std::cout << "Test: " << prefix << middle << suffix << std::endl;

    return 0;
}

高级C++程序员会立即看到它middle()没有调用std::string默认的ctor,而是一个函数声明.

但有趣的是:为什么gcc产生以下输出:

Test: ->1<-

与Visual Studio的链接器错误相比?有谁知道这里发生了什么?



1> Yu Hao..:

一个函数指针将被转换为bool当与使用cout.

为什么函数指针没有被void *隐式转换,哪个运算符<<重载?因为函数指针不是对象指针.

C++11§4.10/ 2:

类型为"指向cv T的指针"的prvalue,其中T是对象类型,可以转换为类型为"指向cv void的指针"的prvalue.将"指向cv T的指针"转换为"指向cv void的指针"的结果指向T类型的对象所在的存储位置的开始,就好像该对象是类型T的最派生对象(1.8) (即,不是基类子对象).空指针值将转换为目标类型的空指针值.


@DR:我认为你的程序有不确定的行为,所以两者都是"正确的".以下是规则:"每个程序应该只包含该程序中使用的每个非内联函数或变量的一个定义;**不需要诊断**."
谢谢,我猜这样的事情.您是否知道VS为什么会产生链接器错误?哪种行为是"标准的",哪种行为是"错误的"?
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有