Последние изменения в синтаксисе лямбды или ошибка gcc? - PullRequest
8 голосов
/ 10 ноября 2011

Я использую svn-версию gcc-4.7.0 , чтобы проверить некоторые функции C ++ 11, например, Лямбда-выражения. Через пару недель некоторые из моих старых примеров, включая Lambdas, больше не компилируются. Интересно:

  • Я пропустил в последний момент изменения в C ++ 11-Lambda-spec, которые были реализованы в gcc-4.7.0 в последние недели?
  • Это ошибка в gcc, которая больше не распознает inline-Lambdas?
  • Или я неправильно понял что-то с помощью лямбда-синтаксиса?

Кажется, что проблемный код включает inline-лямбды, которые предоставляются в качестве аргументов напрямую.

Вы сказали бы, что следующий код является правильным кодом C ++ 11?

#include <thread>
using namespace std;

struct Image {}; // dummy

void fill(int color, const Image& image) {
} // dummy

int main() {
    int red;
    Image img;
    thread th{
        [&img](int c){ fill(c, img); },  // error?
      red };
    th.join();
}

Если я изменю его и сначала назначу лямбду переменной, это сработает:

#include <thread>
using namespace std;

struct Image {}; // dummy
void fill(int color, const Image& image) {
} // dummy

int main() {
    int red;
    Image img;
    auto f = [&img](int c){ fill(c, img); }; // lambda
    thread th{ f, red };                     // ok now
    th.join();
}

Я поместил пример здесь , где оба компилируются с gcc-4.5 (за исключением того, что это вызывает исключение, вероятно, потому что -pthread не связан). Но, как я уже сказал: в моем gcc-4.7.0-svn первый вариант перестал компилироваться пару недель назад.

Обновление Похоже, что сообщение об ошибке является ошибкой разбора:

In function 'int main()':
...:30:11: error: expected '=' before '(' token
...:30:12: error: expected primary-expression before 'int'
...:30:12: error: expected ')' before 'int'
...:30:36: error: no matching function for call to 
           'std::thread::thread(<brace-enclosed initializer list>)'
...:30:36: note: candidates are:
           ...

1 Ответ

3 голосов
/ 10 ноября 2011

Насколько я могу судить по грамматике, определенной в черновике n3242, этот код является допустимым C ++ 11. braced_init-list состоит из списка initializer-clause, который может быть assignment-expression с или самим braced_init_list с. assignment-expression может быть lambda-expression, что является именно тем, что вы имеете в качестве первого элемента ([...](...){...}).

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

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