其他分享
首页 > 其他分享> > c – 使用std :: acos和clang而不是g的Constexpr编译错误

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

作者:互联网

我想尝试将项目从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(标签/ 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,c14,compiler-errors,constexpr,clang-2
来源: https://codeday.me/bug/20191001/1840541.html