static_assert中的std :: pow会触发错误C2057吗?

时间:2014-05-01 01:55:25

标签: c++ c++11 visual-studio-2013 static-assert

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下编译。

  • 这是VS2013的错误吗?
  • 我该如何解决这个问题?

2 个答案:

答案 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;
}

此实现非常简单,但应该在您的用例中使用。