给出以下代码段:
#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的链接器错误相比?有谁知道这里发生了什么?
一个函数指针将被转换为bool
当与使用cout
.
为什么函数指针没有被void *
隐式转换,哪个运算符<<重载?因为函数指针不是对象指针.
C++11§4.10/ 2:
类型为"指向cv T的指针"的prvalue,其中T是对象类型,可以转换为类型为"指向cv void的指针"的prvalue.将"指向cv T的指针"转换为"指向cv void的指针"的结果指向T类型的对象所在的存储位置的开始,就好像该对象是类型T的最派生对象(1.8) (即,不是基类子对象).空指针值将转换为目标类型的空指针值.