Ho problemi con std :: funzioni create da lambdas se la funzione restituisce un riferimento ma il tipo di ritorno non è esplicitamente chiamato come riferimento. Sembra che la funzione std :: sia stata creata correttamente senza avvertimenti, ma al momento della chiamata, viene restituito un valore quando è previsto un riferimento, causando l'esplosione. Ecco un esempio molto artificiosa:Comportamento anomalo di ritorno con std :: function creato da lambda (C++)
#include <iostream>
#include <vector>
#include <functional>
int main(){
std::vector<int> v;
v.push_back(123);
std::function<const std::vector<int>&(const std::vector<int>&)> callback =
[](const std::vector<int> &in){return in;};
std::cout << callback(v).at(0) << std::endl;
return 0;
}
Questo stampa spazzatura, se il lambda viene modificato per restituire in modo esplicito riferimento a un const funziona benissimo. Riesco a capire il compilatore pensando che lambda è return-by-value senza il suggerimento (quando inizialmente mi sono imbattuto in questo problema, il lambda restituiva direttamente il risultato da una funzione che restituiva un riferimento const, nel qual caso pensavo che il il ritorno di riferimento const della lambda sarebbe deducibile, ma apparentemente no.) Quello che mi sorprende è che il compilatore consente di costruire la funzione std :: dal lambda con tipi di ritorno non corrispondenti. È previsto questo comportamento? Mi manca qualcosa nello standard che permetta questo disadattamento? Lo vedo con g ++ (GCC) 4.8.2, non l'ho provato con nient'altro.
Grazie!
@Nawaz Perché hai eliminato la risposta? – Barry
Clang ++ 3.7.0 stampa anche garbage (g ++ porta a un errore di segmentazione per me). – jhnnslschnr
@jhnnslschnr Grazie per il controllo - non so perché la risposta postata è stata cancellata (sembrava corretta) ma l'essenza era che un lambda che restituisce un valore si legherà felicemente a una funzione std :: con un tipo di ritorno di riferimento, il risultato finale è che il lambda restituisce una copia e la funzione restituisce un riferimento alla copia temporanea. Suppongo che non sia diverso dal restituire una variabile locale da una funzione con un tipo di ritorno di riferimento. – Kevin