2014-05-01 60 views
1

在Visual Studio 2013下面的代碼導致錯誤C2057:std :: pow在static_assert觸發錯誤C2057?

#include <cmath> 

int main() { 
    static_assert(std::pow(2, 2) < 5, "foobar"); 
    return 0; 
} 

error C2057: expected constant expression

如果我編譯GCC -std=c++0x下正常工作。 http://ideone.com/2c4dj5

如果我更換std::pow(2, 2)4,還編譯的Visual Studio 2013年

  • 這是一個VS2013的錯誤下?
  • 我該如何解決這個問題?
+0

Visual C++ 2013不支持'constexpr'。但即使這樣做,'pow'也不一定是'constexpr',所以你的代碼最好是不可移植的,並且依賴於實現擴展。 –

回答

6

std::pow不是constexpr功能。 GCC接受你的代碼的原因是因爲它提供了一個builtin versionpow,它在編譯時評估函數,因爲參數是已知的。如果將​​標誌添加到GCC命令行中,則代碼爲fails to compile。錯誤信息如預期:

error: non-constant condition for static assertion

所以,這不是VS2013的錯誤,而是GCC優化的影響。鐺doesn't compile的代碼。

1

解決方法是將您自己的pow作爲constexpr函數來實現。

template<typename T> 
constexpr T _pow(T x, size_t y) { 
    return y ? x * _pow(x, y-1) : 1; 
} 

這個實現非常簡單,但應該在你的用例中工作。