这个简单的程序(在Linux上编译时)将根据是否使用-std=c++0x
编译,正确地给出两个不同的答案。
问题:我无法在OS X(Mountain Lion,10.8 SDK)上复现相同的情况。我漏掉了什么?
#include <iostream>
#include <sstream>
class Thing : public std::ostringstream
{
public:
Thing() : std::ostringstream() {}
virtual ~Thing() { std::cerr << str(); }
};
int main(int argc, const char * argv[]) {
Thing() << "Hello" << std::endl;
return 0;
}
为了理解我的意思,请按照以下步骤操作(首先在Linux上操作,以便了解它应该如何工作):
> g++ main.cpp
> ./a.out
0x401471
> g++ -std=c++0x main.cpp
> ./a.out
Hello
第一个将打印十六进制地址,第二个将打印“Hello”。这是正确的行为,因为运算符<<
解析为两个不同的东西(在C++03中没有rvalue引用,所以你可以这样做)。
现在,在OS X上尝试同样的事情:
> xcrun c++ main.cpp
> ./a.out
0x10840dd88
(这将正确生成十六进制输出。)
> xcrun c++ -std=c++0x main.cpp
> ./a.out
0x10840dd88
(哎呀...还是十六进制输出...我们处于C++11x模式,但也许没有使用正确的头文件?)
注意:编译器版本在这里:
> xcrun c++ --version
Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.2.0
Thread model: posix
注意:这不是C ++本身的问题,而是OS X构建问题。对于那些感兴趣的人,下面的答案中突出了它在使用C++03和C++11时产生不同结果的原因。
#include <stream>
对我来说无法编译。你能修复一下这个包含指令吗?-- 没关系,我已经解决了。 - Keith Thompson