PDA

View Full Version : [C++0x] Bug di Visual Studio 2010


tomminno
31-07-2010, 14:50
Mi è capitato di scrivere questo codice semplice semplice:

for_each(a.begin(),a.end(), [&](const A & aa) {
for_each(aa.B().begin(),aa.B().end(), [&](const B & bb) {
...
});
});

E ho perso lo scope della classe in cui è inserito il codice.
Poi trovo questo: http://connect.microsoft.com/VisualStudio/feedback/details/537366/c-nested-lambda-functions-lose-scope

Insomma tocca attendere il primo SP per usare a pieno le lambda in Visual Studio...

pabloski
31-07-2010, 16:12
speriamo non riprendano i viziacci che avevano fino alla versione '97 altrimenti ci sarà da sgobbare notti intere a fare i cacciavitari cercatori di bug :D

fero86
31-07-2010, 20:48
Mi è capitato di scrivere questo codice semplice semplice:

for_each(a.begin(),a.end(), [&](const A & aa) {
for_each(aa.B().begin(),aa.B().end(), [&](const B & bb) {
...
});
});

E ho perso lo scope della classe in cui è inserito il codice.
Poi trovo questo: http://connect.microsoft.com/VisualStudio/feedback/details/537366/c-nested-lambda-functions-lose-scope

Insomma tocca attendere il primo SP per usare a pieno le lambda in Visual Studio... si, mi ero accorto anche io che poi da dentro le lambda expressions non vedi piu alcune cose che stanno fuori: io per esempio mi sono accorto che non riuscivo a vedere i tipi dichiarati nello stesso scope della chiamata for_each, per esempio:

void test() {
class Foo {};
string str = "pappappero";
for_each(str.begin(), str.end(), [=] (char ch) {
Foo foo; // erroreh!!
// ...
});
}

ma non dovrebbe essere normale? se pensi che quella lambda expression é del tutto assimilabile ad un funtore é come se io facessi:

void test() {
class Foo {};
string str = "pappappero";
class Functor {
public:
void operator () (char ch) {
Foo foo; // errore?
// ...
}
} f;
for_each(str.begin(), str.end(), f);
}

e traducendo il codice in questa maniera mi sembra normale che ci sia un errore, non mi sembra un bug.

marco.r
31-07-2010, 22:17
ma non dovrebbe essere normale?

Non e' normale, perche' se usi la lambda non hai piu' l'istanza dell'oggetto con cui interagire con l'ambiente. E in effetti lo standard prevede di specificare con quali variabili interagire (oppure, come nel caso di tommino, specificare tutte le variabili, usando [&]).