структурированный инициализатор привязки внутри оператора 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;
), но суть должна быть ясна.