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

时间:2019-06-13 16:08:58

标签: 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;
    }
}

以下内容虽然可以满足我的要求。

    if (auto a = foo())
    {
      if (auto b = foo()) {
        std::cout << "a = " << *a << ", b = " << *b << std::endl;
      }
    }

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

3 个答案:

答案 0 :(得分:5)

自C ++ 17起,您可以编写

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

但是,如果您希望看到短路现象,则应该更改条件:

#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            ^^
    }
}

比较this

的输出
foo called.
a = 1, b = 0

former相对。

答案 1 :(得分:2)

auto无关。声明不能是表达式的一部分。您可以在if语句中使用表达式或单个声明。

因此,即使这样也无法编译:

#include <iostream>

int foo()
{
    return 0;
}

int main()
{
    if (int a = foo() && int b = foo())
    {
        std::cout << "a = " << a << ", b = " << b << std::endl;
    }
    return 0;
}

编辑:在C ++ 17中,您可以在条件语句之前有一个初始化程序语句,例如:if (auto a = foo(), b = foo(); a && b)。但这不会使您短路。

答案 2 :(得分:2)

我看到的唯一方法是重新格式化(无需在<div id="tabStrip"> <ul> <li id='tab1'>Tab 1</li> <li id='tab2'>Tab 2</li> </ul> <div>Content 1</div> <div>Content 2</div> </div> <script> // event handler for activate var onActivate = function(e) { // access the activated item via e.item (Element) if(e.item.id == "tab1"){ alert("func 1"); } else if (e.item.id == 'tab2') { alert("func 2"); } }; // attach activate event handler during initialization var tabStrip = $("#tabStrip").kendoTabStrip({ activate: onActivate }).data("kendoTabStrip"); </script> 条件内声明变量):

if

请参见一个有效的示例here


自c ++ 17起,您甚至可以在#include <iostream> #include <optional> std::optional<int> foo() { return 0; } int main() { std::optional<int> a , b; if ((a = foo()) && (b = foo())) { std::cout << "a = " << *a << ", b = " << *b << std::endl; } } 条件内进行变量声明,如下所示:

if

在这种情况下,无法使用if (std::optional<int> a , b; (a = foo()) && (b = foo()))

另一个live demo