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()
并将复杂的内容放在单独的函数中。也会使它可重复使用。以前关于这个问题的一些讨论:,从另一个角度