Функция constexpr содержит const - будет ли она вычисляться во время компиляции? - PullRequest
0 голосов
/ 21 ноября 2018

Пожалуйста, кто-нибудь может уточнить (я использую Visual Studio 15.9.2):

В следующем коде, учитывая, что Pi_cnst оценивается во время выполнения (потому что определение Pi таким образом требует вычисления времени выполнения), будет ли RAD2DEG_cnst когда-либо оцениваться во время компиляции, или использование constexpr всегда возвращается к const?

edit - add: Если оно всегда возвращается к const, то стоит ли ожидать предупреждения илиэто плохо каким-то другим способом, то есть кажется странным, что можно так легко объявить constexpr для тела, которое будет принято, но ВСЕГДА таково, что оно на самом деле никогда не будет constexpr.Что я пропустил?

constexpr double Pi_error = std::acos(-1.0); //error function call must have a constant value in a constant expression (does not compile)
const double Pi_cnst = std::acos(-1.0); //ok evaluated at run time

constexpr double Pi_expr = 3.1415926; //ok valid constexpr

constexpr double RAD2DEG_cnst(double rad) { return rad * 180.0 / Pi_cnst; } //no error or warning BUT is this ever evaluated at compile time?
constexpr double RAD2DEG_expr(double rad) { return rad * 180.0 / Pi_expr; } //ok can be evaluated at compile time

const double result1 = RAD2DEG_cnst(0.1); //evaluated at run time?
const double result2 = RAD2DEG_expr(0.2); //evaluated at compile time?

double myVariable = 0.3;
const double result3 = RAD2DEG_expr(myVariable); //ok - but can only be evaluated at run time

const double myOtherVariable = 0.4;
const double result4 = RAD2DEG_expr(myOtherVariable); //ok - evaluated at compile time because parameter is CONST?

Я также нашел функцию constexpr и ее параметр и constexpr против const против constexpr const .

1 Ответ

0 голосов
/ 21 ноября 2018

Ваш код неверен, диагностика не требуется.В

constexpr double RAD2DEG_cnst(double rad) { return rad * 180.0 / Pi_cnst; }

Нет ввода, который когда-либо сделает функцию основным константным выражением , которое задается как [dcl.constexpr] / 5

Для функции constexpr или конструктора constexpr, который не является ни значением по умолчанию, ни шаблоном, если не существует значений аргумента, так что вызов функции или конструктора может быть оцененным подвыражением выражения основной константы или дляконструктор, постоянный инициализатор для некоторого объекта ([basic.start.static]), программа некорректна, диагностика не требуется.

...