Пожалуйста, кто-нибудь может уточнить (я использую 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 .