繁体   English   中英

使用 std::acos 和 clang++ 而不是 g++ 的 Constexpr 编译错误

[英]Constexpr compile error using std::acos with clang++ not g++

我想尝试将项目从 gcc 迁移到 clang++。 我承认我的无知,我不知道为什么下面的代码

template <typename T>
constexpr T pi{std::acos(T(-1.0))};

使用 g++ 静默编译,但 clang++ 产生错误

trig.hpp:3:13: error: constexpr variable 'pi<float>' must be initialized by a constant expression
constexpr T pi{std::acos(T(-1.0))};

我希望有人比我更了解它,可以启发我。

注意:尝试使用 -std=C++14 和 C++1y。 在 clang 版本 3.6.2 (tags/RELEASE_362/final) 下失败。 适用于 g++ (GCC) 5.2.0。

Clang 在这里是正确的,我们不允许在常量表达式中使用acos

问题是acos在标准中没有标记为 constexpr 但gcc 将标准中未标记的一些函数包括 acos 视为 constexpr 这是一个不符合标准的扩展,最终应该在 gcc 中修复。

内置函数通常用于常量折叠,我们可以看到如果我们将-fno-builtin与 gcc 一起使用,它会禁用这种不符合规范的行为,我们将收到以下错误:

error: call to non-constexpr function 'double acos(double)'
constexpr T pi{std::acos(T(-1.0))};
                         ^

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM