if 语句中的结构化绑定初始值设定项无法编译
structured binding initializer inside if statement does not compile
阅读 C++17,现在可以在 if 语句中进行多次初始化:
if (int x = func(), y = func2(); x > 0 && y > 0)
{
}
不错,还结合了 C++17 中的另一个特性,结构化绑定:
if (auto[iter, success] = set.insert("Hello"); success)
{ }
else
{ }
但是结合这两个功能在 VisualStudio 2017 中无法编译。
if (auto[iter, success] = set.insert("Hello"), [iter2, success2] = set.insert("Foo"); success && success2)
{}
else
{}
missing ';' before ','
这是 VS2017 中的错误还是不可能?
MSVC 在这方面是对的。这仅针对语法:
selection-statement:
if ( init-statement condition )
init-statement:
simple-declaration
simple-declaration:
decl-specifier-seq init-declarator-list;
decl-specifier-seq ref-qualifier [ identifier-list ] initializer ;
上面是对整个标准的总结(为简洁起见,删除了一些可选的东西),但起点是 [stmt.select]/1。
问题的症结在于 simple-declaration
要么是逗号分隔的声明符列表,这些声明符引入相同类型的对象1 (decl-specifier-seq init-declarator-list;
) 或 单个结构化绑定(simple-declaration
下的第二个相当冗长的行)。
1 严格来说 不是同一类型(int x, *y;
),但重点应该清楚。
阅读 C++17,现在可以在 if 语句中进行多次初始化:
if (int x = func(), y = func2(); x > 0 && y > 0)
{
}
不错,还结合了 C++17 中的另一个特性,结构化绑定:
if (auto[iter, success] = set.insert("Hello"); success)
{ }
else
{ }
但是结合这两个功能在 VisualStudio 2017 中无法编译。
if (auto[iter, success] = set.insert("Hello"), [iter2, success2] = set.insert("Foo"); success && success2)
{}
else
{}
missing ';' before ','
这是 VS2017 中的错误还是不可能?
MSVC 在这方面是对的。这仅针对语法:
selection-statement:
if ( init-statement condition )
init-statement:
simple-declaration
simple-declaration:
decl-specifier-seq init-declarator-list;
decl-specifier-seq ref-qualifier [ identifier-list ] initializer ;
上面是对整个标准的总结(为简洁起见,删除了一些可选的东西),但起点是 [stmt.select]/1。
问题的症结在于 simple-declaration
要么是逗号分隔的声明符列表,这些声明符引入相同类型的对象1 (decl-specifier-seq init-declarator-list;
) 或 单个结构化绑定(simple-declaration
下的第二个相当冗长的行)。
1 严格来说 不是同一类型(int x, *y;
),但重点应该清楚。