constexpr函数包含一个const-是否会在编译时对其进行评估?

时间:2018-11-21 15:15:42

标签: c++ constexpr

请有人澄清一下(我正在使用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 function and its parameterconstexpr vs const vs constexpr const

1 个答案:

答案 0 :(得分:3)

您的代码格式错误,无需诊断。在

stds = 1.0 
filtered_ df = df[~df.groupby('Code')['P'].transform(lambda x: abs((x-x.mean()) / x.std()) > stds)]

    Code  Year  Month  Day     Q      P
0    100  2017      1    4   2.0  42.90
1    100  2017      1    9   2.0  42.90
2    100  2017      1   18   1.0  45.05
3    100  2017      1   19   2.0  45.05
4    100  2017      1   20   1.0  45.05
5    100  2017      1   24  10.0  46.40
6    100  2017      1   26   1.0  46.40
11   100  2017      2    9   1.0  45.05
13   100  2017      3    8   1.0  49.90
14   100  2017      3   17   6.0  45.05
15   100  2017      3   24   1.0  45.05

filtered_df[['Code', 'Year', 'Month','P']].groupby(['Code', 'Year', 'Month']).mean()
                     P
Code Year Month           
100  2017 1      44.821429
          2      45.050000
          3      46.666667

没有任何输入可以使函数成为core constant expression指定的[dcl.constexpr]/5

  

对于既没有默认值也没有模板的constexpr函数或constexpr构造函数,如果不存在任何参数值,使得对该函数或构造函数的调用可以是核心常量表达式的求值子表达式,或者对于构造函数,则为某个对象([basic.start.static])的常量初始化程序,程序格式错误,无需诊断。