C++ Conversione al puntatore della funzione


Esempio

Se la lista di cattura di un lambda è vuota, allora lambda ha una conversione implicita in un puntatore a funzione che prende gli stessi argomenti e restituisce lo stesso tipo di ritorno:

auto sorter = [](int lhs, int rhs) -> bool {return lhs < rhs;};

using func_ptr = bool(*)(int, int);
func_ptr sorter_func = sorter; // implicit conversion

Tale conversione può anche essere applicata utilizzando un operatore unario più:

func_ptr sorter_func2 = +sorter; // enforce implicit conversion

La chiamata a questo puntatore di funzione si comporta esattamente come invocando operator() sul lambda. Questo puntatore a funzione non è in alcun modo dipendente dall'esistenza della chiusura lambda sorgente. Potrebbe quindi sopravvivere alla chiusura lambda.

Questa funzione è utile principalmente per l'utilizzo di lambda con API che trattano i puntatori di funzione, piuttosto che gli oggetti funzione C ++.

C ++ 14

La conversione a un puntatore di funzione è anche possibile per lambda generico con una lista di cattura vuota. Se necessario, verrà utilizzata la deduzione degli argomenti del modello per selezionare la specializzazione corretta.

auto sorter = [](auto lhs, auto rhs) { return lhs < rhs; };
using func_ptr = bool(*)(int, int);
func_ptr sorter_func = sorter;  // deduces int, int
// note however that the following is ambiguous
// func_ptr sorter_func2 = +sorter;