簡體   English   中英

std :: decay和std :: remove_reference之間的區別

[英]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_referenceremove_reference不會。 它將只去除類型的“引用”部分。

參考

將左值到右值,數組到指針和函數到指針的隱式轉換應用於類型T,刪除cv限定符,並將結果類型定義為成員typedef類型。

因此,與std::remove_reference相比, std::remove_reference std::decay將執行更多的類型轉換。

對於更細微的應用程序,還有其他類型修飾符,它們僅執行decay可能的變換集中的選定部分,例如remove_cvremove_volatile或在C ++ 20中為remove_cvref

刪除引用將留下constvolatile 如果那是您想要的,那么就足夠了。

刪除cvref可以完成衰減的大部分操作,但是不會將函數類型和數組類型轉換為指針。

衰減以某種方式轉換類型,您可以合理地將其副本存儲在數組或struct ,或者將其從函數返回或傳遞給函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM