如何使用 constexpr 逻辑?

How do I use constexpr logic?

我想在一段代码中实现一些 constexpr 逻辑。我能够毫无问题地编译和执行这段代码。

#include <iostream>

int main(){
    std::cout << "Starting c++ main" << std::endl;

    constexpr int val_1 = 100;
    int val_2;

    if constexpr (val_1 == 100){
        val_2 = 10;
    }
    else if constexpr (val_1 == 200){
        val_2 = 20;
    }

    std::cout << val_2 << std::endl;
}

但实际上,val_2 也应该是 constexpr。如何让 val_2 成为 constexpr?我尝试了几件事,但没有成功。如果我将 val_2 声明为 constexpr,则不允许我在 if 语句中更改其值。如果我没有在 if 语句的主体之前声明 constexpr 变量,那么它(正如预期的那样)没有在 if 语句之外定义。

您可以将初始值设定项放在三元表达式中:

constexpr int val_2 = val_1 == 100 ? 10 : val_1 == 200 ? 20 : 0;

如果您的初始化逻辑更复杂,您可以编写一个 constexpr 函数,如下所示:

constexpr auto f(int val_1) 
{
  int val_2{};

  if (val_1 == 100){
    val_2 = 10;
  }

  else if (val_1 == 200){
    val_2 = 20;
  }

  return val_2;
}

然后:

constexpr int val_2 = f(val_1);

另外,请注意 if constexpr 应该只用于有条件地编译代码。常规控制流不需要它。

您可以使用立即调用的 lambda:

constexpr int val_2 = []() {
    if constexpr (val_1 == 100){
        return 10;
    }
    else if constexpr (val_1 == 200){
        return 20;
    }
}();