оператор запятой с C ++ 11 для цикла

Сначала я хотел попробовать, было ли разрешено делать что-то вроде:

vector<int> a{1, 2};
vector<int> b{3, 4};

for(auto ai : a, auto bi : b)
{

}

Это не сработало, но я ожидал этого из-за ограничения размера.

Однако я был удивлен, что это тоже не сработало:

vector<int> b{3, 4};

for(int x = 1, auto bi : b)
{

}

Разве оператор запятой не предназначен для разрешения каждого побочного эффекта его левой стороны перед переходом на правую сторону?

2

Решение

Во втором случае у вас есть декларация. Объявления могут содержать объявления нескольких переменных, через запятую.

То, что вы пишете во втором случае, эквивалентно следующему объявлению

int x = 1, auto bi;

for (...) ...

И причина того, что первое не сработало, не из-за какого-либо ограничения размера, а из-за синтаксиса спектр for петля просто не позволяет вам делать что-то подобное.

4

Другие решения

Оператор запятой является оператор. Это означает, что его можно использовать только в выражениях. int x = 1, auto bi : b это определенно не выражение. Таким образом, вы не можете использовать его там.

Это выглядит как неправильно сформированная декларация. Неверно сформирован, потому что вы пытаетесь изменить объявленный тип.

Обратите внимание, что грамматика языка на самом деле использует специальный нетерминал для-диапазона декларирование для части на левой стороне :, Который в конечном итоге разрешается в одну декларацию. Поэтому нельзя объявлять более одной переменной в цикле for на основе диапазона.

2