Я использую svn-версию gcc-4.7.0 , чтобы проверить некоторые функции C ++ 11, например Лямбда-выражения. Через пару недель некоторые из моих старых примеров, включая Lambdas, больше не компилируются. Интересно:
Проблемный код, похоже, включает встроенные лямбда-выражения, которые предоставляются напрямую в качестве аргументов.
Вы бы сказали, что следующий код является правильным кодом C ++ 11?
#include
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
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()'
...:30:36: note: candidates are:
...