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

чтение на 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 ответов


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.выбор]/1.

суть дела в том, что simple-declaration - это либо разделенный запятыми список деклараторов, которые вводят объекты одного и того же типа1 (decl-specifier-seq init-declarator-list;) или одна структурированная привязка ( во-вторых, довольно многословная строка под simple-declaration).


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