Visual Studio 2013中的以下代码导致错误C2057:
#include <cmath>
int main() {
static_assert(std::pow(2, 2) < 5, "foobar");
return 0;
}
错误C2057:预期的常量表达式
如果我在GCC -std=c++0x
下编译它可以正常工作。 http://ideone.com/2c4dj5
如果我用std::pow(2, 2)
替换4
,它也会在Visual Studio 2013下编译。
答案 0 :(得分:6)
std::pow
不是constexpr
函数。 GCC接受您的代码的原因是因为它提供了builtin version pow
,它在编译时评估函数,因为参数已知。如果将-fno-builtin
标志添加到GCC命令行,则代码为fails to compile。错误消息是预期的:
错误:静态断言的非常量条件
所以,这不是VS2013的错误,而是GCC优化的效果。 clang doesn't compile代码。
答案 1 :(得分:1)
解决方法是将您自己的pow
实现为constexpr函数。
template<typename T>
constexpr T _pow(T x, size_t y) {
return y ? x * _pow(x, y-1) : 1;
}
此实现非常简单,但应该在您的用例中使用。