定义 if 块内部的常量"variable"

Defining const "variable" inside if block

本文关键字:常量 variable 内部 if 定义      更新时间:2023-10-16

我有以下代码:

Foo a;
if (some_fairly_long_condition) {
   a = complicated_expression_to_make_foo_1();
} else {
   a = complicated_expression_to_make_foo_2();
}

我有两个问题:

  1. aconst,应该这样声明
  2. "空"构造函数Foo()被无故调用(也许它被优化了?)

一种解决方法是使用三元运算符:

const Foo a = some_fairly_long_condition?
      complicated_expression_to_make_foo_1():
      complicated_expression_to_make_foo_2();

这种做法好吗?你怎么做的?

要回答问题的第二部分
我通常将初始化代码放入lambda:

const Foo a = [&]()->Foo{
    if (some_fairly_long_condition) {
        return complicated_expression_to_make_foo_1();
    } else {
        return complicated_expression_to_make_foo_2();
    }
}();

在大多数情况下,您甚至应该能够省略尾部返回类型,这样您就可以编写

const Foo a = [&](){ ...

第一部分而言:
我想说,这在很大程度上取决于初始化代码的复杂程度。如果这三个部分都是非常复杂的表达式(而不仅仅是每个部分的函数调用),那么使用三元运算符的解决方案就会变得一团糟,而lambda方法(或单独的命名函数)允许您将这些部分分解为各自的子表达式。

如果问题是避免使用ternay运算符,并且您的目标是定义常数a,则此代码是一个选项:

Foo aux;
if (some_fairly_long_condition) {
   aux = complicated_expression_to_make_foo_1();
} else {
   aux = complicated_expression_to_make_foo_2();
}
const Foo a(aux);

这是一个很好的解决方案,没有任何新功能(如lambdas),并且根据需要包括内联代码。