我希望能够在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;
}
}
但是我有办法在第一个语法中使用语法吗?用括号括住表达式不起作用。
答案 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。