C ++ лямбда-выражение не компилируется - PullRequest
4 голосов
/ 08 мая 2011

Я пытаюсь cin значение индекса цикла в самом цикле, используя лямбда-выражение:

#include<iostream>
using namespace std;

int main(){
  for(int a, ([](int & b){cin>>b;})(a); a < 2; ++a);
  return 0;
}

Это ошибки при компиляции с использованием g ++ 4.5 на Ubuntu:

forLoopAndCinTest.c++: In function ‘int main()’:
forLoopAndCinTest.c++:5:14: error: expected unqualified-id before ‘[’ token
forLoopAndCinTest.c++:5:14: error: expected ‘)’ before ‘[’ token
forLoopAndCinTest.c++:5:34: error: expected primary-expression before ‘)’ token
forLoopAndCinTest.c++:5:34: error: expected ‘;’ before ‘)’ token
forLoopAndCinTest.c++:5:40: error: name lookup of ‘a’ changed for ISO ‘for’ scoping
forLoopAndCinTest.c++:5:40: note: (if you use ‘-fpermissive’ G++ will accept your code)
forLoopAndCinTest.c++:5:50: error: expected ‘;’ before ‘)’ token

Если я использую обычную функцию вместо лямбды, программа прекрасно компилируется.
Использование -fpermissive тоже не помогает.
Есть идеи?

Ответы [ 3 ]

5 голосов
/ 08 мая 2011

Это не так, как выглядит for.Вы пытаетесь вызвать лямбду, где компилятор ожидает, что вы объявите int:

for( int a, int2, ...; a < 2; ++a );

Теперь

Если я использую обычную функцию вместо лямбды,программа прекрасно компилируется

Да, но, вероятно, она не делает то, что вы думаете.

void f(int& b)
{
    cin >> b;
}

// ...
for( int a, f(a); a < 2; ++a );

Здесь цикл объявляет две int переменные, названные a и f.Цикл не вызывает f(), как вы могли бы ожидать.

Попробуйте вместо этого:

for( int a; cin >> a && a < 2; ++a );
2 голосов
/ 08 мая 2011

Первая часть для интерпретируется как объявление. Мы получаем ту же ошибку при замене вашего кода (почти) эквивалентом:

int main(){
    int a, ([](int & b){cin>>b;})(a); // This produces the same error
    for(; a < 2; ++a);
    return 0;
}

Чтобы ответить на ваш комментарий, for (int a, foo() ; ... работает, но не так, как вы думаете. Фактически это объявление функции (внутри области видимости), которая возвращает int и имеет имя foo . Как в:

int a, foo();

Что вы должны прочитать как:

int a;
int foo();
0 голосов
/ 08 мая 2011

После этого: for( int a, компилятор ожидает какое-то имя (переменной) - unqualified-id.Но в вашем случае это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...