为什么复数文字不能在clang中起作用?

时间:2016-08-27 06:45:20

标签: c++ c++11 clang complex-numbers user-defined-literals

当我运行此代码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)

想象中发生了什么?我做错了吗?

1 个答案:

答案 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;
}

来自documentation

  

这些运算符在命名空间中声明   std :: literals :: complex_literals,其中包含文字和   complex_literals是内联命名空间。 访问这些运营商即可   使用命名空间std :: literals,使用命名空间获得   std :: complex_literals,并使用命名空间   的std ::文字:: complex_literals。