Non uguale ma probabilmente correlato a this question about static initializers.Perché un lambda (che acquisisce 'this') in un membro funzione-try-block handler non può accedere ai membri di dati privati in VC++ 2013?
Ecco le prime due funzioni compilare bene, e l'ultima non lo fa in VC++, ma lo fa in clang e gcc:
class A {
protected:
std::string protected_member = "yay";
public:
void withNormalBlock();
void withFunctionBlock();
void noLambda();
};
void A::withNormalBlock() {
try {
throw std::exception();
} catch (...) {
[this]() {
std::cout << protected_member << std::endl;
}();
}
}
void A::noLambda() try {
throw std::exception();
} catch (...) {
std::cout << protected_member << std::endl;
}
void A::withFunctionBlock() try {
throw std::exception();
} catch (...) {
[this]() {
// this line is the problem:
std::cout << protected_member << std::endl;
}();
}
- in clang (OK)
- in gcc (OK)
- in vc++ (
error C2248: 'A::protected_member' : cannot access protected member declared in class 'A'
) - vc++ 2015 - accordo stesso
Non riesco a trovare nulla nello standard per suggerire che il blocco gestore/catch di un blocco funzione-try debba essere esente dall'ambito della funzione o che il tipo di chiusura lambda debba cambiare. Il codice viene compilato se il tipo di accesso viene modificato a tutti i pubblici.
Quale potrebbe essere la causa principale? È un bug o è qualcosa di specifico nelle impostazioni del compilatore che potrebbe essere cambiato?
Sembra che si tratta di un bug, lo standard non menziona nulla circa la portata cattura essendo al di fuori dell'ambito della funzione membro della classe e sono riuscito a trovare la prova che il lambda è generato al di fuori dell'ambito della funzione membro della classe. Dovresti segnalarlo. –
Ora che il mio modulo di feedback non si blocca più, ho: https://connect.microsoft.com/VisualStudio/feedback/details/1749162 – MechEngineer