Apa alasan keberadaannya std::decay
? Dalam situasi apa std::decay
berguna?
c++
c++11
standard-library
Eric Javier Hernandez Saura
sumber
sumber
decay_t<decltype(...)>
adalah kombinasi yang bagus, untuk melihat apa yangauto
akan disimpulkan.Jawaban:
<canda> Ini jelas digunakan untuk meluruhkan
std::atomic
tipe radioaktif menjadi non-radioaktif. </joke>N2609 adalah makalah yang diusulkan
std::decay
. Makalah ini menjelaskan:Contoh yang memotivasi adalah C ++ 03
std::make_pair
:yang menerima parameternya dengan nilai untuk membuat string literal berfungsi:
Jika ia menerima parameternya dengan referensi, maka
T1
akan disimpulkan sebagai tipe array, dan kemudian membangunpair<T1, T2>
akan menjadi salah bentuk.Tapi jelas ini menyebabkan inefisiensi yang signifikan. Oleh karena itu perlunya
decay
, untuk menerapkan serangkaian transformasi yang terjadi ketika nilai demi nilai terjadi, memungkinkan Anda untuk mendapatkan efisiensi dengan mengambil parameter dengan referensi, tetapi masih mendapatkan jenis transformasi yang diperlukan untuk kode Anda untuk bekerja dengan string literal, tipe array, tipe fungsi dan sejenisnya:Catatan: ini bukan
make_pair
implementasi C ++ 11 yang sebenarnya - C ++ 11make_pair
juga membukastd::reference_wrapper
s.sumber
Ketika berhadapan dengan fungsi templat yang mengambil parameter dari tipe templat, Anda sering memiliki parameter universal. Parameter universal hampir selalu merupakan referensi dari satu jenis atau lainnya. Mereka juga memenuhi syarat const-volatile. Dengan demikian, sebagian besar sifat tipe tidak berfungsi seperti yang Anda harapkan:
http://coliru.stacked-crooked.com/a/24476e60bd906bed
Solusinya di sini adalah menggunakan
std::decay
:http://coliru.stacked-crooked.com/a/8cbd0119a28a18bd
sumber
decay
sangat agresif, misalnya jika diterapkan pada referensi ke array itu menghasilkan pointer. Biasanya terlalu agresif untuk metaprogramming IMHO semacam ini.remove_const_t< remove_reference_t<T> >
, mungkin dibungkus dengan metafungsi khusus.