c++11——move/forward

std::move

c++11中提供了std::move()来将左值转换为右值,从而方便的使用移动语义。move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存拷贝。 
    c++中所有容器都实现了move语义,方便我们实现性能优化。move只是转移了资源的控制权,本质上是将左值强制转换为右值引用,以用于move语义,避免含有资源的对象发生无谓的拷贝。move对于拥有形如对内存、文件句柄等资源的成员的对象有效。如果是一些基本类型,比如int或char[10]数组等,如果使用move,仍然会发生拷贝(因为没有对应的移动构造函数),所以move对于含资源的对象来说更有意义。

    std::list<std::string> tokens;
    std::list<std::string> t = std::move(tokens); //发生了移动构造。list在实现的时候,是将目的对象的资源句柄赋值为源对象的资源句柄,而将源对象的资源句柄清空。
std::forward

右值引用类型是独立于值的,一个右值引用参数作为函数的形参,在函数内部再转发该参数的时候它已经变成一个左值,并不是他原来的类型。

如果我们需要一种方法能够按照参数原来的类型转发到另一个函数,这种转发类型称为完美转发

template<typename T>
void print(T& t){
    cout << "lvalue" << endl;
}
template<typename T>
void print(T&& t){
    cout << "rvalue" << endl;
}

template<typename T>
void TestForward(T && v){
    print(v);
    print(std::forward<T>(v));
    print(std::move(v));
}

int main(){
    TestForward(1);
    int x = 1;
    TestForward(x);
    TestForward(std::forward<int>(x));
    return 0;
}

时间: 2024-11-01 06:03:39

c++11——move/forward的相关文章

C++ 11 move constructor 何时调用?

C++11支持移动语义. 一:为什么需要移动语义和什么是移动语义 我们先来看看C++11之前的复制过程.假设有下列代码: vector<string> v1(1000000);//v1存放着100W个string,假设每个string长度为1000 vector<string> v2(v1);//使用v1初始化v2 vector和string类都使用动态内存分配,因此他们必须定义使用他们自己的new版本的复制构造函数. 复制构造函数vector<string>将使用ne

C++11 move 语义

首先认识3种拷贝构造函数:1.默认的拷贝构造函数: 2.自己定义的拷贝构造函数: 3.move拷贝构造函数: typedef struct MyTest{ int a; int b; float c; int * d; MyTest ():a(1),b(2),c(2.2){ d = new int[10]; for(int i = 0;i<10;i++){ d[i] = i; } } ~MyTest(){ delete []d; } }MyTest; 对于这么个结构体 默认的构造函数,就会依次对

C++11 现代C++风格的新元素--简介

C++11标准推出了很多有用的新特性,本文特别关注那些相比C++98更像是一门新语言的特性,理由是: 这些特性改变了编写C++程序使用的代码风格和习语[译注 1],通常也包括你设计C++函数库的方式.例如,你会看到更多参数和返回值类型为智能指针(smart pointer),同时也会看到函数通过值传递返回大型对象.你将会发现在大多数的代码示例中充斥着新特性的身影.例如,几乎每5行现代C++代码示例都会使用到auto. C++11的其他特性也很棒.但是请先熟悉下面这些,正是由于这些特性的广泛使用使

C++11 之 &quot; = delete &quot;

1  缺省函数 设计一个类,没有成员函数 (member function),只有成员数据 (member data) class DataOnly { private: std::string strName; // member data int iData; }; 1.1  特殊成员函数 C++98 编译器会为其隐式的产生四个函数:缺省构造函数,析构函数:拷贝构造函数,拷贝赋值算子   而 C++11 编译器,除了产生这四个函数外,还会多产生两个函数:移动构造函数,移动赋值算子 class

Win7常用但是被忽略的快捷键

General keyboard shortcuts 1.Ctrl + Right Arrow Move the cursor to the beginning of the next word  向右移动光标到下个文字开始 2.Ctrl + Left Arrow Move the cursor to the beginning of the previous word 向左移动光标到下个文字开始 3.Ctrl + Shift with an arrow key Select a block o

OpenGL学习--07--模型加载(obj)

1.tutorial07.cpp // Include standard headers #include <stdio.h> #include <stdlib.h> #include <vector> // Include GLEW #include <GL/glew.h> // Include GLFW #include <glfw3.h> GLFWwindow* window; // Include GLM #include <glm

(转) Playing FPS games with deep reinforcement learning

Playing FPS games with deep reinforcement learning 博文转自:https://blog.acolyer.org/2016/11/23/playing-fps-games-with-deep-reinforcement-learning/ When I wrote up 'Asynchronous methods for deep learning' last month, I made a throwaway remark that after

Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十一)之Holding Your Objects

To solve the general programming problem, you need to create any number of objects, anytime, anywhere. So you can't rely on creating a named reference to hold each one of your objects. Java has several ways to hold objects: 1. the compiler-supported

Leetcode--Day13&amp;&amp;Day14

n-sum problem Question 2 Two Sum Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be le