Jakie są powody istnienia std::decay
? W jakich sytuacjach std::decay
przydaje się?
c++
c++11
standard-library
Eric Javier Hernandez Saura
źródło
źródło
decay_t<decltype(...)>
to fajna kombinacja, aby zobaczyć, coauto
by to wydedukować.Odpowiedzi:
<joke> Oczywiście służy do rozkładania
std::atomic
typów radioaktywnych na nieradioaktywne. </joke>N2609 to papier, który zaproponował
std::decay
. Artykuł wyjaśnia:Motywującym przykładem jest C ++ 03
std::make_pair
:który zaakceptował jego parametry według wartości, aby literały łańcuchowe działały:
Jeśli zaakceptuje swoje parametry przez odniesienie, to
T1
zostanie wydedukowane jako typ tablicy, a następnie zbudowanie apair<T1, T2>
będzie źle sformułowane.Ale oczywiście prowadzi to do znacznej nieefektywności. Stąd potrzeba
decay
zastosowania zestawu transformacji, które występują, gdy wystąpi przekazanie przez wartość, co pozwala uzyskać efektywność pobierania parametrów przez odniesienie, ale nadal uzyskać transformacje typu potrzebne do działania kodu z literałami ciągów, typy tablic, typy funkcji i tym podobne:Uwaga: nie jest to rzeczywista
make_pair
implementacja C ++ 11 - C ++ 11make_pair
również rozpakowujestd::reference_wrapper
s.źródło
W przypadku funkcji szablonu, które pobierają parametry typu szablonu, często masz parametry uniwersalne. Parametry uniwersalne są prawie zawsze referencjami takiego czy innego rodzaju. Są również wykwalifikowani. W związku z tym większość cech typu nie działa na nich tak, jak można się spodziewać:
http://coliru.stacked-crooked.com/a/24476e60bd906bed
Rozwiązaniem jest użycie
std::decay
:http://coliru.stacked-crooked.com/a/8cbd0119a28a18bd
źródło
decay
jest bardzo agresywny, np. po zastosowaniu do odwołania do tablicy daje wskaźnik. Zazwyczaj jest zbyt agresywny dla tego rodzaju metaprogramowania IMHO.remove_const_t< remove_reference_t<T> >
ewentualnie zawinę w niestandardową metafunkcję.