2015-09-28 122 views
7

我想试验一个项目从gcc到clang ++。我承认无知就我而言,我不知道为什么代码Constexpr编译错误与铿锵++不g ++

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

下位相克默默编译++但铛++产生错误

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。

+3

看起来相关[它是一个符合编译器扩展将非constexpr标准库函数视为constexpr?](http://stackoverflow.com/q/27744079/1708801) –

+0

@ShafikYaghmour我以为我搜索得很好。我错了。谢谢。这确实是一个令人失望的结果。我也很惊讶,GCC在标准允许禁止的情况下至少会发出警告。我也正在编译-pedantic! 如果你想写一个答案,我会接受它。 – Timtro

+1

我不觉得这个问题没有出现,关键字的重叠似乎很小。当我大约一年前第一次遇到这个问题时,我找不到任何东西,直到我意外地碰到2013年语言工作组的问题时,我才把它们放在一起。 –

回答

9

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

问题是acos没有在标准中标记为constexpr,而是gcc treats some functions not marked in the standard including acos as constexpr。这是一个non-conforming extension,最终应该在gcc中修复。

Builtin functions经常被用来固定倍,我们可以看到,如果我们使用​​用gcc它禁用这个不符合规定的行为,我们会收到以下错误:

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