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

Tim*_*tro 7 c++ compiler-errors constexpr clang++ c++14

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

template <typename T>
constexpr T pi{std::acos(T(-1.0))};
Run Code Online (Sandbox Code Playgroud)

使用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))};
Run Code Online (Sandbox Code Playgroud)

而且我希望有人比我更了解它,可以启发我.

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

Sha*_*our 10

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

问题是acos在标准中没有标记为constexpr,但gcc处理标准中未标记的一些功能,包括acos作为constexpr.这是一个不合格的扩展,最终应该在gcc中修复.

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

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