在OS X上,简单的C ++程序给出了错误的结果(这是命令行选项'c ++ 03'与'c ++ 11'的结果)

在OS X上,简单的C ++程序给出了错误的结果(这是命令行选项'c ++ 03'与'c ++ 11'的结果),第1张

在OS X上,简单的C ++程序给出了错误的结果(这是命令行选项'c ++ 03'与'c ++ 11'的结果)

首先,行为上的预期差异是因为

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<<
右值引用的重载。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5012204.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存