这个简单的程序(在 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 中没有右值引用,所以你去吧)。
现在,在 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 产生不同结果的原因在下面的答案之一中突出显示。