Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “定义常数”;变量";内部if块_C++ - Fatal编程技术网

C++ “定义常数”;变量";内部if块

C++ “定义常数”;变量";内部if块,c++,C++,我有以下代码: Foo a; if (some_fairly_long_condition) { a = complicated_expression_to_make_foo_1(); } else { a = complicated_expression_to_make_foo_2(); } 我对此有两个问题: a是一个const,应该这样声明 “空”构造函数Foo()被无缘无故地调用(也许这是优化了?) 解决此问题的一种方法是使用三元运算符: const Foo a = som

我有以下代码:

Foo a;
if (some_fairly_long_condition) {
   a = complicated_expression_to_make_foo_1();
} else {
   a = complicated_expression_to_make_foo_2();
}
我对此有两个问题:

  • a
    是一个
    const
    ,应该这样声明
  • “空”构造函数
    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方法(或者是单独命名的函数)允许您将这些部分分解为相应的子表达式。

    如果问题是为了避免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),也没有您想要的内联代码。

    当然,但部分问题是条件运算符是否是实现这一点的好方法。我认为它比这个lambda好。@juanchopanza:就我而言,这取决于
    复杂的表达式..
    一些相当长的条件
    只是函数名的占位符,或者实际上是复杂的长表达式。当然,通过“适当”的格式设置可以实现很多,但当自动格式设置起作用时,这通常不起作用,此外,lambda版本允许您将这些语句分解为更简单的子部分。同意。我的假设是,如果复杂表达式的长度超过几个标记,它们就会被放入函数中。因此,我发现我的两个表达式的类型不同,所以即使是三元运算符也无法工作:/这是一个意见问题,在我看来,是的,这是使用条件运算符的一个很好的例子。另一个选项是
    const Foo a=compute_Foo()
    并将复杂的内容放在单独的函数中。也会使它可重复使用。以前关于这个问题的一些讨论:,从另一个角度