3
#include <type_traits>

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

void main()
{
    int a;
    move(a);
}

为什么这段代码不能编译?

错误 C2440:“返回”:无法在“int &&”中转换“int”

4

2 回答 2

7

v是返回语句中的左值(命名右值引用是左值,出于安全原因),但返回类型move是右值引用(Tis int&,但您删除了引用,因此您int &&在返回类型中形成类型)。

当您想要返回它时,您static_cast需要首先创建一个未命名的右值引用。vremove_reference<T>::type &&

我不确定你的目标是什么。要么你想使用std::move(就像你在标题中说的那样),要么你想了解它是如何实现的(就像你展示的代码所示)。std::move在不了解基本 C++ 规则的情况下尝试了解其工作原理是没有意义的。我建议您查看我们的C++ Books List。在掌握了 C++ 之后,您可以了解其std::move工作原理。

于 2011-04-03T13:49:36.510 回答
4

这直接来自 C++0x 草案标准(§20.2.3/6):

template <class T> typename remove_reference<T>::type&& move(T&& t) noexcept;

回报static_cast<typename remove_reference<T>::type&&>(t)

因此,如果您将move实现更改为以下内容,它就可以正常工作:

template<class T>
typename std::remove_reference<T>::type&& move(T&& v)
{
    return static_cast<typename std::remove_reference<T>::type&&>(v);
}
于 2011-04-03T13:51:49.043 回答