是否可以在 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 替换 boost 代码,它就可以正常工作。
最佳答案
我怀疑这可能是原因。 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>;
}
关于c++ - 在 constexpr 中使用 boost 数学常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21688678/