c ++:if块语法内部有多个分配,用于短路

Moc*_*han 3 c++ short-circuiting

我希望能够在if块中进行多个分配,如果第一个失败则将其短路。但是,这不会编译并表示,expected primary-expression before ‘auto’

#include <iostream>
#include <optional>

std::optional<int> foo()
{
    return 0;
}

int main() {
    if (auto a = foo() && auto b = foo())
    {
        std::cout << "a = " << *a << ", b = " << *b << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

下面的作品,虽然和我想要的。

    if (auto a = foo())
    {
      if (auto b = foo()) {
        std::cout << "a = " << *a << ", b = " << *b << std::endl;
      }
    }
Run Code Online (Sandbox Code Playgroud)

但是我有办法在第一个语法中使用语法吗?使用括号将表达式括起来不起作用。

Bob*_*b__ 5

从C ++ 17开始,您可以编写

if (decltype(foo()) a, b; (a = foo()) && (b = foo()))
{
    std::cout << "a = " << *a << ", b = " << *b << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您想了解短路的作用,则应更改条件:

#include <iostream>
#include <optional>

std::optional<int> foo()
{
    std::cout << "foo called.\n";
    return 1;
}

int main()
{
    if (decltype(foo()) a, b; (a = foo()) or (b = foo()))
    {
        // For exposition only            ^^
        std::cout << "a = " << *a << ", b = " << *b << std::endl;
        // Note that, now, this is UB            ^^
    }
}
Run Code Online (Sandbox Code Playgroud)

比较器的输出

foo叫。
a = 1,b = 0

前者相比

  • 看起来很棒。聪明的解决方案。+1 (2认同)