Io uso la versione svn del gcc-4.7.0 per controllare alcune funzionalità di C++ 11, ad es. Lambda Expressions. Da un paio di settimane alcuni dei miei vecchi esempi incluso Lambdas non sono più compilati. Mi chiedo:Modifica dell'ultimo minuto nella sintassi Lambda o bug di gcc?
- Ho perso una modifica dell'ultimo minuto nella specifica C++ 11-Lambda che è stata implementata in gcc-4.7.0 nelle ultime settimane?
- Si tratta di un bug in gcc, che non riconosce più inline-Lambdas?
- Oppure ho frainteso qualcos'altro con la sintassi Lambda?
Il codice problematico sembra coinvolgere inline-Lambdas forniti direttamente come argomenti.
Diresti che il codice seguente è corretto codice 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();
}
Se cambio e assegno il Lambda a una variabile prima funziona:
#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();
}
Ho messo un esempio here dove entrambi compila con gcc-4.5 (tranne che solleva un'eccezione, probabilmente perché -pthread
non è collegato). Ma come ho detto: nella mia gcc-4.7.0-svn la prima variante ha smesso di compilare un paio di settimane fa.
Aggiornamento Il messaggio di errore sembra essere un errore di analisi:
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:
...
Qual è l'errore? –
@Vaughn Cato: Scusa, certo. aggiornamento ... – towi
Cosa succede se si parentesi il lambda? ([& img] (int c) {fill (c, img);}) –