在逻辑 AND 表达式中保证函数调用

Guarantee function call in logical AND expression

我正在使用 C++ 原子重构一些代码。代码如下所示:

std::atomic<bool> someFlag{}; // This can be set to true using a public method

// ...

const bool cond1 { someFunction() };
const bool cond2 { otherFunction() };

if (someFlag.load())
{
    someFlage.store(false);

    if (cond1 && cond2)
    {
        performSomeAction();
    }
}

我目前正计划像这样重写 if 语句:

if (std::atomic_exchange(&someFlag, false) &&
    cond1 && cond2)
{
    performSomeAction();
}

极其重要的是,在这条if语句之后,someFlag变量被设置为false。 因此,我想确保对 atomic_exchange 的调用始终发生,而不管 cond1cond2 的值如何。我可以保证会是这种情况吗,因为无论优化设置如何,布尔表达式都是从左到右求值的?

是的,订单有保证。来自 cppreference.com:

Every value computation and side effect of the first (left) argument of the built-in logical AND operator && and the built-in logical OR operator || is sequenced before every value computation and side effect of the second (right) argument.

if (std::atomic_exchange(&someFlag, false) && cond1 && cond2)

  • std::atomic_exchange(&someFlag, false) 将首先被调用。

  • 如果评估为 true,则评估为 cond1

  • 如果 cond1 为真,计算 cond2

  • 最后 performSomeAction() 如果 cond2 也是 true.