Инициализатор структурированного связывания внутри if не компилируется

Чтение на С++ 17 и теперь возможны несколько инициализаций внутри if:

if (int x = func(), y = func2(); x > 0 && y > 0)
{
}

Хороший, также в сочетании с другой функцией в С++ 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

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;) или одно структурированное связывание (вторая, довольно verbose строка под simple-declaration).


<суб > 1 Не строго один и тот же тип (int x, *y;), но точка должна быть ясной. Суб >