当前位置:   article > 正文

C++:深入理解C++11新特性:Chapter3:左值和右值_++ 左值 右值

++ 左值 右值


在C语言中,我们常常会提起左值(lvalue),右值(rvalue)这样的称呼,而在编译程序时,编译器有时也会报出错误信息中包含 左值,右值说法。不过左值、右值通常不是通过一个严谨的定义而为人所知。下面我通过这样一个例子,来引导大家认识: 左值,右值,左值引用,右值引用,常量左值引用

#include<iostream>

struct Copyable{
	Copyable() {
		std::cout<< "copied...." << std::endl;
	}
	Copyable(const Copyable &copy)
	{
		std::cout<< "copied" << std::endl;
	}
};

Copyable ReturnRvalue()
{
	// 这是返回的 右值  
	return Copyable();
}

// 1. 接收右值表达式
void AcceptValue(Copyable copy)
{
	
}

// 2. 右值引用减少对象开销,并延迟对象生命周期
//  直观意义:为临时变量续命,也就是为右值续命,因为右值在表达式结束后就消亡了,
// 如果想继续使用右值,那就会动用昂贵的拷贝构造函数。
void AcceptRef(Copyable && copy)
{
	
}

// 3. 常量左值引用减少对象开销,并延迟对象生命周期
void AcceptRef_2(const Copyable& copy){}

int main()
{
	Copyable copy;
	std::cout << "Pass by value:" << std::endl;
	AcceptValue(ReturnRvalue());
	
	std::cout << "Passs by reference: " << std::endl;
	AcceptRef(ReturnRvalue());
	
	std::cout << "Passs by reference_2: " << std::endl;
	AcceptRef(ReturnRvalue());
}
// 打印结果: g++ -std=c++11 main.cpp -fno-elide-constructors

// Copyable copy
construct.....       

Pass by value:

// ReturnRvalue() 函数:调用一次构造函数构造Copyable ,一次拷贝构造函数作为ReturnRvalue函数返回值,一次拷贝函数作为AcceptValue函数实参
construct.....     
copied construct
copied construct


Passs by reference:
// ReturnRvalue() 函数:调用一次构造函数构造Copyable ,一次拷贝构造函数作为ReturnRvalue函数返回值,由于是引用传递,那么直接将此返回值作为AcceptRef函数实参
construct.....
copied construct

// ReturnRvalue() 函数:调用一次构造函数构造Copyable ,一次拷贝构造函数作为ReturnRvalue函数返回值,由于是引用传递,那么直接将此返回值作为AcceptRef函数实参
Passs by reference_2:
construct.....
copied construct

	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

上面的例子:我们用到了

  1. 函数形参为左值,然后将右值表达式作为实参绑定到左值
  2. 函数形参为右值引用,然后将右值作为实参绑定右值引用
  3. 函数形参为常量左值引用,然后将右值作为实参绑定到 常量左值引用

1. 将右值绑定到 左值

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/640028
推荐阅读
相关标签