是否可以在constexpr中使用boost数学常量?
例如,以下行:
static constexpr double SEC3 = static_cast<double>(45)/180*boost::math::double_constants::pi;
给我错误
Error - constexpr variable 'SEC3' must be initialized by a constant expression
但如果我用简单的M_PI替换升压代码,它就可以正常工作。
答案 0 :(得分:3)
我怀疑这可能是原因。 Coliru出现此错误:
clang++ -std=c++1y -O2 -Wall -pedantic -pthread main.cpp && ./a.out
/usr/local/include/boost/math/constants/constants.hpp:248:52: note: expanded from macro 'BOOST_DEFINE_MATH_CONSTANT'
namespace double_constants{ static const double name = x; } \
如果它被定义为const
而不是constexpr
,那么这可能是它拒绝代码的原因。为了让自己放心是问题的根源,我们可以使用此测试用例重现错误:
// This code fails
#include <boost/math/constants/constants.hpp>
namespace double_constants{ static const double name = 25; }
static constexpr double SEC3 = static_cast<double>(45)/180*double_constants::name;
那么我们该如何解决这个问题呢?不要使用non-templated version。 Boost提供了我们可以使用的templated version。
static constexpr double SEC3 = static_cast<double>(45)/180*boost::math::constants::pi<double>();
clang 3.5还使用C ++ 1y模式实现变量模板:
template <class T>
static constexpr T SEC3 = static_cast<T>(45)/180*boost::math::constants::pi<T>();
int main()
{
std::cout << SEC3<double>;
}
答案 1 :(得分:1)
当我在寻找使用boost库将pi定义为constexpr double的最简洁方法时,我看到了这篇文章。以下代码片段在Visual Studio 2017中使用boost 1_66_0:
可以很好地适用于我#include <boost/math/constants/constants.hpp>
constexpr double pi = boost::math::constants::pi<double>();