c++ - 使用带有 clang++ 而不是 g++ 的 std::acos 的 Constexpr 编译错误

标签 c++ compiler-errors c++14 constexpr clang++

我想尝试将一个项目从 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 treats some functions not marked in the standard including acos as constexpr .这是 non-conforming extension并且最终应该在 gcc 中得到修复。

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

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

关于c++ - 使用带有 clang++ 而不是 g++ 的 std::acos 的 Constexpr 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33569232/

相关文章:

c++ - Eigen :张量乘法运算符的奇怪行为

android - 按下按钮后应用程式当机,但 Action 正常

java - 如果我使用类作为类型参数,如何在参数化类中创建该对象的实例?

c++ - 具有嵌套类型的类的概念

c++ - 将实现注入(inject)到单个多功能接口(interface)类 - 许多 CRTP 类?

c++ - 将元素从 std::vector 移动到另一个

c++ - 在C++中将类导出到静态库时,如何隐藏类的私有(private)函数?

c# - 为什么我的 C# 应用程序无法加载我的 C++ dll?

c - 用 calloc 分配的多维数组

c++ - 完整对象还是子对象?