c++ - move 语义 std::move 如何使用它

标签 c++ visual-c++ c++11 rvalue-reference move-semantics

#include <type_traits>

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

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

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

error C2440: 'return' : impossible to convert 'int' in 'int &&'

最佳答案

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

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

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

关于c++ - move 语义 std::move 如何使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5529881/

相关文章:

c++ - C++ 中更宽松的抛出说明符

c++ - C++ 中的局部变量通常在什么时候分配内存?

c++ - 了解 C++ 示例 - 打印机、句柄、字符串

c++ - 正确转换为指向返回函数的函数的函数指针

c++ - 四舍五入到小数点后第二位

c++ - MySQL 连接器 c++ 不包含 libmysql.lib

c++ - avl树中删除过程的实现

c++ - 结构继承并用基类初始化

c++ - 在 map 中使用 lambda 作为比较器时的匿名类型警告

c++ - 将 lambda 函数作为参数传递时没有匹配函数错误