Come mostrato in questa pagina http://en.cppreference.com/w/cpp/thread/async, uno della firma del std::async
in C++ 14 è stato modificato dal C++ 11 versionetipi di decadimento prima di passare a std :: result_of
template< class Function, class... Args>
std::future<typename std::result_of<Function(Args...)>::type>
async(Function&& f, Args&&... args);
a
template< class Function, class... Args>
std::future<std::result_of_t<std::decay_t<Function>(std::decay_t<Args>...)>>
async(Function&& f, Args&&... args);
le modifiche sono le std::decay_t
s (che rimuovono riferimenti e CV-qualificazioni e array decadimento/funzioni in puntatori) applicati su tipi di funzioni e argomenti prima che siano passati al std::result_of
. Non riesco a capire perché il decadimento sia utile. Ad esempio, per un tipo di funzione Fn
(forse un alias di tipo di una classe di chiusura), passando Fn
, Fn&&
, const Fn&
ecc. Sembrano tutti produrre lo stesso risultato.
Qualcuno può darmi un esempio concreto in cui il decadimento è utile?
UPDATE: A titolo di esempio, questo codice:
#include <iostream>
#include <type_traits>
int main()
{
auto fn = [](auto x) -> int { return x + 1; };
using Fn = decltype(fn);
using FnRef = Fn&;
using FnCRef = const Fn&;
using FnRRef = Fn&&;
std::cout << std::boolalpha
<< std::is_same<int, std::result_of_t<Fn(int)>>::value << '\n'
<< std::is_same<int, std::result_of_t<FnRef(int)>>::value << '\n'
<< std::is_same<int, std::result_of_t<FnCRef(int)>>::value << '\n'
<< std::is_same<int, std::result_of_t<FnRRef(int)>>::value << '\n';
return 0;
}
sarà stampare quattro true
s.
Penso che abbia un significato per riferimento a un tipo di funzione. – 101010
@ 101010 Non 'decay' rimuove la qualifica di riferimento? – NathanOliver
@ 101010 Si prega di consultare il mio aggiornamento. –