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