const变量的条件初始化

cbu*_*art 8 c++ initialization const c++11

以下基本代码是一个非常大的过程的一部分:

int x = foo();
if (x == 0) x = bar();
Run Code Online (Sandbox Code Playgroud)

x 在其他任何地方都没有修改,所以我可以这样做:

const int x = foo() == 0 ? bar() : foo();
Run Code Online (Sandbox Code Playgroud)

但是这foo()是一个非常昂贵和复杂的功能,所以我不能因为性能和它可能产生竞争条件并因此获得不同的值(它可能涉及读取外部资源)两次调用它.

我想让代码尽可能可读,如果可能的话,尽可能简短.一种选择是:

const int foo_ = foo(), x = foo_ == 0 ? bar() : foo_;
Run Code Online (Sandbox Code Playgroud)

另一方面,我想避免使用这种时间变量,主要是因为foo()可能依赖于外部资源,因此foo_在代码的其余部分中使用缓存值是无效的.

我正在发布我正在使用的解决方案,但我想知道是否有更好的选项(没有或几个代码混乱,在同一范围内没有时间变量,可读性......).提前致谢!

PS:它必须遵循至少C++ 11标准,因为它属于跨平台项目.

我知道它可能是基于意见的,但考虑到先前关于简单性(不是混乱代码)和避免时间变量(不是为了可读性而是为了代码安全性)的陈述,我想知道解决这个问题的选项.

Pau*_*l R 6

如果您乐意使用gcc扩展,那么您可以写:

const int x = foo() ?: bar();
Run Code Online (Sandbox Code Playgroud)

  • 看起来很棒,但不幸的是我必须遵循标准,因为它是跨平台代码。我会在 gcc 代码中考虑它,谢谢!很高兴在未来的标准中看到它。 (2认同)

cbu*_*art 5

到目前为止,我找到的解决方案是使用 lambda 函数,例如:

const int x = [](int n) { return n == 0 ? bar() : n; }(foo());
Run Code Online (Sandbox Code Playgroud)

  • 这太复杂了,理解起来并不简单。 (2认同)

Hum*_*awi 4

由于这是基于意见的问题,我会选择:

auto get_the_correct_x=[](){
    const auto temp=foo();
    return temp==0?bar():temp;
}
const auto x=get_the_correct_x();
Run Code Online (Sandbox Code Playgroud)

一个好的名字比get_the_correct_x直接使用 lambda 而不命名会更清晰。