2014-02-10 3 views
3

Можно ли использовать форсированные математические константы в constexpr?с использованием форсированных математических констант в constexpr

Например, следующая строка:

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, он отлично работает.

+1

Работы по 'НКУ 4.8.2'. Какой компилятор вы используете? – pmr

+0

О, ты прав. Это удивительно ... Я собираюсь с Clang 3.4. С gcc он работает нормально. – WestFlame

+0

@pmr Это, по-видимому, ошибка [gcc] (http://gcc.gnu.org/PR57979). –

ответ

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, что может быть, почему он отвергает код. Для того, чтобы убедить себя, что является источником проблемы, мы можем воспроизвести ошибку с этим TestCase:

// 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>(); 

лязг 3,5 также реализует переменные шаблонов с режимом 1y C++:

template <class T> 
static constexpr T SEC3 = static_cast<T>(45)/180*boost::math::constants::pi<T>(); 

int main() 
{ 
    std::cout << SEC3<double>; 
} 
+0

Отличное объяснение, спасибо :). – WestFlame

+0

hmm, похоже, что CUDA nvcc.exe не согласен с использованием шаблонной версии «ошибка: вызов функции должен иметь постоянное значение в постоянном выражении» – JHBonarius

Смежные вопросы