if语句中没有编译的结构化绑定初始化程序

时间:2017-09-11 13:00:54

标签: c++ c++17 structured-bindings

阅读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中的错误还是不可能?

1 个答案:

答案 0 :(得分:17)

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;),但重点应该是明确的。