Я использую 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:
...