[英]What are the differences between `typename std::remove_reference<T>` and `constexpr typename std::remove_reference<T>`?
[英]Difference between std::decay and std::remove_reference
使用C ++進行模板元編程時,我經常遇到以下情況:
template <typename T>
S<T> make_wrapper(T&& t) { return S<T>(std::forward<T>(t)); }
我知道我應該在返回類型中使用類似std::decay
東西,但是為什么std::remove_reference
也不能std::remove_reference
工作? 這有什么區別? 那么std::remove_cvref
呢?
考慮一下
#include <type_traits>
int main()
{
static_assert(std::is_same_v<
std::decay_t<const int&>,
std::remove_reference_t<const int&>
>); // int != const int
}
std::decay
會刪除任何cv- remove_reference
, remove_reference
不會。 它將只去除類型的“引用”部分。
從參考 :
將左值到右值,數組到指針和函數到指針的隱式轉換應用於類型T,刪除cv限定符,並將結果類型定義為成員typedef類型。
因此,與std::remove_reference
相比, std::remove_reference
std::decay
將執行更多的類型轉換。
對於更細微的應用程序,還有其他類型修飾符,它們僅執行decay
可能的變換集中的選定部分,例如remove_cv
, remove_volatile
或在C ++ 20中為remove_cvref
。
刪除引用將留下const
和volatile
。 如果那是您想要的,那么就足夠了。
刪除cvref可以完成衰減的大部分操作,但是不會將函數類型和數組類型轉換為指針。
衰減以某種方式轉換類型,您可以合理地將其副本存儲在數組或struct
,或者將其從函數返回或傳遞給函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.