首先,行为上的预期差异是因为
operator<<(std::ostream&, constchar*)重载(实际上是函数模板的专门化,但暂时不要紧)具有类型参数,
std::ostream&并且左值引用只能绑定到左值,并且在您的示例中,流是右值,因此无法使用重载。在C
03中,这意味着唯一可行的重载是
std::ostream::operator<<(const void*)成员函数,因为 可以
在rvalue对象上调用成员函数,因此该字符串
void*以十六进制形式写为地址。在C
11中,有一个新的
operator<<(std::ostream&&, constT&)函数模板,该模板允许写入右值流并转发给
operator<<(std::ostream&, constchar*)重载,因此输出字符串而不是十六进制地址。
在GNU / Linux上,您大概使用的是最新版本的GCC版本,该版本在编译器(g )和标准库(libstdc )中都对C ++
11有很好的支持,因此它具有
operator<<(std::ostream&&, const T&)重载功能,并且一切正常。
在OS X上,您可能将Clang与GCC的标准库libstdc 一起使用。Xpre默认附带一个古老版本的GCC(4.2),而GCC
4.2中的标准库不支持C 11,因此不存在
operator<<右值流的重载。using
-std=c++0x告诉Clang支持C
11语言功能(例如右值引用),但是并不能神奇地使GCC 4.2的库增长C 11代码,而当GCC
4.2出现时,这在标准委员会看来并不是一闪而过的。被释放。苹果公司没有提供非史前的libstdc
,而是编写了自己的标准库实现与LLVM和Clang项目一起使用。using
-stdlib=libc++告诉clang使用该libc
标准库实现而不是古老的libstdc 。由于libc 是最近写的,它具有
operator<<右值引用的重载。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)