13

当我在 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)

虚部发生了什么?难道我做错了什么?

4

1 回答 1

10

我相信对于第一个示例,编译器使用的是 GNU 扩展:

-fext-numeric-literals (C++ and Objective-C++ only)

接受虚构的、定点的或机器定义的文字数字后缀作为 GNU 扩展。关闭此选项后,这些后缀将被视为 C++11 用户定义的文字数字后缀。默认情况下,所有 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-imaginary-constant]

无论哪种方式,您的代码都不符合标准。要使用 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::literals::complex_literals 来访问这些运算符。

于 2016-08-27T06:59:38.100 回答