【问题标题】:Why don't complex-number literals work in clang?为什么复数文字在 clang 中不起作用?
【发布时间】:2016-08-27 06:45:20
【问题描述】:

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

虚部发生了什么?我做错了吗?

【问题讨论】:

  • 你试过this和clang吗?
  • 刚刚做了。结果相同。
  • Clang编译命令不应该是clang++ -std=c++14吗?
  • 有趣。 -std=c++14 触发错误no matching literal operator for call to 'operator""i' ...。为什么它会在没有这个的情况下编译?
  • @jtbandes 用户定义文字作为 语言 特性是 C++11 的一部分。 string、chrono、complex 的文字运算符被放入 C++14 的 library 中。因此 C++11 编译器知道 3i 是用户定义的文字,但无法在任何库中找到 operator""i(unsigned long long n)

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


【解决方案1】:

我相信对于第一个示例,编译器使用的是 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;
}

来自documentation

这些操作符在命名空间中声明 std::literals::complex_literals,其中文字和 complex_literals 是内联命名空间。 访问这些运算符可以 使用命名空间 std::literals 获得,使用命名空间 std::complex_literals,并使用命名空间 std::literals::complex_literals。

【讨论】:

  • 啊,我应该考虑摆弄警告标志...确实,启用 -Weverything 给了我warning: imaginary constants are a GNU extension,更重要的是warning: implicit conversion discards imaginary component。令人沮丧的是,默认情况下不会打开此警告...
  • @jtbandes:我明白了,虚数部分被隐式转换为 int 所抛弃。这里学到的教训是always compile at the highest warning level possible。这适用于所有编译语言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
相关资源
最近更新 更多