为什么 std::move 使用 std::remove_reference 实现?

发布于 2024-10-29 11:31:40 字数 238 浏览 0 评论 0原文

我不太明白 std::move 函数

template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
    return a;
}

为什么要 remove_reference ? 有人能给我一个简单的解释吗?

I don't understand very well the std::move function

template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
    return a;
}

why remove_reference ?
could someone give me a simple explanation ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

娜些时光,永不杰束 2024-11-05 11:31:40

考虑一下如果 T 是左值引用(例如 MyClass &)会发生什么。在这种情况下,T && 将变为 MyClass & &&,并且由于引用折叠规则,这将再次转换为 MyClass &。为了获得正确的结果,typename remove_reference::type&& 首先从类型中删除所有引用装饰,因此 MyClass & 映射到 < code>MyClass,然后将右值引用应用于它,产生 MyClass &&

Think about what happens if T is an lvalue reference, for example MyClass &. In that case, T && would become MyClass & &&, and due to reference collapsing rules, this would be transformed into MyClass & again. To achieve the right result, typename remove_reference<MyClass&>::type&& first removes any reference decorations from the type, so MyClass & is mapped to MyClass, and then the rvalue reference is applied to it, yielding MyClass &&.

故事和酒 2024-11-05 11:31:40

因为右值引用对左值引用会衰减为左值引用,并且返回左值引用将具有与您期望从 move 获得的语义不同的语义。

编辑:
呵呵,为什么投反对票?查看此代码:

template < typename T > T&& func(T&& x) { return x; }

int main()
{
        int x;

        int &y = func(x);
}

进一步阅读:http://www.justsoftwaresolutions.co.uk/cplusplus /rvalue_references_and_perfect_forwarding.html

Because rvalue reference to lvalue reference would decay to lvalue reference, and returing lvalue reference would have different semantics from those you would expect from move.

Edit:
Huh, why the downvote? Check out this code:

template < typename T > T&& func(T&& x) { return x; }

int main()
{
        int x;

        int &y = func(x);
}

Further reading: http://www.justsoftwaresolutions.co.uk/cplusplus/rvalue_references_and_perfect_forwarding.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文