[英]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.