当我运行此代码on ideone.com时,它会打印(2,3)
:
#include <iostream>
#include <complex>
int main() {
std::complex<double> val = 2 + 3i;
std::cout << val << std::endl;
return 0;
}
但是当我在macOS 10.11.6上使用clang时,我没有收到任何错误或警告,但输出为(2,0)
:
$ clang --version
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.6.0
$ clang -lc++ test.cpp && ./a.out
(2,0)
想象中发生了什么?我做错了吗?
答案 0 :(得分:10)
我相信第一个例子,编译器正在使用GNU扩展:
-fext-numeric-literals (C++ and Objective-C++ only)
接受虚数,定点或机器定义的文字数 后缀为GNU扩展名。关闭此选项时 后缀被视为C ++ 11用户定义的文字数字后缀。 对于所有pre-C ++ 11方言和所有GNU方言,默认情况下启用: -std = c ++ 98,-std = gnu ++ 98,-std = gnu ++ 11,-std = gnu ++ 14。默认情况下,此选项在ISO C ++ 11之后关闭(-std = c ++ 11,...)。
当我用clang运行它时(我使用-Wall -pedantic
?:)):
警告:虚构常量是GNU扩展 [-Wgnu-虚常数]
无论哪种方式,您的代码都不符合标准。要使用C ++ 14文字,请编写代码:
#include <iostream>
#include <complex>
using namespace std::complex_literals;
int main() {
std::complex<double> val = 2.0 + 3i;
std::cout << val << std::endl;
return 0;
}
这些运算符在命名空间中声明 std :: literals :: complex_literals,其中包含文字和 complex_literals是内联命名空间。 访问这些运营商即可 使用命名空间std :: literals,使用命名空间获得 std :: complex_literals,并使用命名空间 的std ::文字:: complex_literals。强>