gpt4 book ai didi

c++ - std::remove_reference 解释了吗?

转载 作者:IT老高 更新时间:2023-10-28 12:39:20 27 4
gpt4 key购买 nike

我看到了 std::remove_reference 的可能实现如下

template< class T > struct remove_reference      {typedef T type;};
template< class T > struct remove_reference<T&> {typedef T type;};
template< class T > struct remove_reference<T&&> {typedef T type;};

为什么lvalue 有专门化?和 rvalue reference ?通用模板本身是否足够并删除引用?我在这里很困惑,因为在 T&T&&如果我尝试使用 ::type 的特化我仍然应该得到 T&T&&分别对吗?

您能否解释一下我们为什么要转换为 remove_reference<t>::type&&在移动? (是不是因为参数被命名了,所以在move函数中会被当作左值处理?)。

另外,您能否指出一种方法,让我可以找出并打印类型是什么?例如,如果它是 rvalue类型 int那么我应该可以打印出 int&&通过了? (我一直使用 std::is_same 来检查,但手动。)

感谢您的宝贵时间。

最佳答案

why is it that there are specializations for lvalue and rvalue reference?

如果只有主模板存在,那么做:

remove_reference<int&>::type

会给你:

int&

然后做:

remove_reference<int&&>::type

会给你:

int&&

这不是你想要的。左值引用和右值引用的特化允许剥离 &&& ,分别来自您传递的类型参数。

例如,如果你正在做:

remove_reference<int&&>

类型int&&将匹配 T&& 指定的模式特化,T正在 int .由于特化定义了类型别名 type成为 T (在本例中为 int ),这样做:

remove_reference<int&&>::type

会给你int .

could you explain how, why we cast to remove_reference<t>::type&& in move?

那是因为如果 move()定义如下:

    template<typename T>
T&& move(T&& t) { ... }
// ^^^
// Resolves to X& if T is X& (which is the case if the input has type X
// and is an lvalue)

那么返回类型将为X&如果 move() 的参数是 X 类型的左值(这就是所谓的“通用引用”)。我们要确保返回类型是 always 一个右值引用。

move() 的目的|是给你一个右值,不管你输入什么。由于对返回类型为右值引用的函数的函数调用是右值,我们真的想要 move()总是返回一个右值引用。

这就是我们这样做的原因remove_reference<T>::type&& , 因为附加了 &&到非引用类型总是保证产生一个右值引用类型。

Also could you point out a way whereby I can find out and print what the type is?

我不确定您在这里所说的“打印”是什么意思。我知道没有可移植的方式将类型的名称转换为字符串(无论您如何获得该类型)。

另一方面,如果您的目标是确保传递了一个右值,则可以使用如下静态断言:

#include <type_traits>

template<typename T>
void foo(T&&)
{
static_assert(!std::is_reference<T>::value, "Error: lvalue was passed!");
// ...
}

这依赖于这样一个事实:当 X 类型的左值正在通过,T将推导出为 X& .

如果您只想产生替换失败,也可以使用等效的 SFINAE 约束:

#include <type_traits>

template<typename T, typename std::enable_if<
!std::is_reference<T>::value>::type* = nullptr>
void foo(T&&)
{
// ...
}

关于c++ - std::remove_reference 解释了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17000179/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com