定义const"变量"在内部如果阻止

时间:2016-07-25 06:29:47

标签: c++

我有以下代码:

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()被无缘无故地调用(也许这被优化了?)
  3. 解决这个问题的一种方法是使用三元运算符:

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

    这是好习惯吗?你是如何去做的?

2 个答案:

答案 0 :(得分: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方法(或者单独的命名函数)允许您拆分这些部分进入各自的子表达式。

答案 1 :(得分:0)

如果问题是要避免使用ternaty运算符,并且您的目标是定义常量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 ---并且包含内联代码,如你所愿。