18

阅读 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
{}

失踪 ';' 前 ','

这是VS2017中的错误还是不可能?

4

1 回答 1

18

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

问题的症结在于,asimple-declaration要么是一个逗号分隔的声明符列表,它引入了相同类型的对象1 ( decl-specifier-seq init-declarator-list;) ,要么是一个单一的结构化绑定(第二个,相当冗长的行simple-declaration)。


1不是严格意义上的同一类型(int x, *y;),但要点应该清楚。

于 2017-09-11T13:18:51.973 回答