首页 > 编程语言 >c++返回值不能是右值对象

c++返回值不能是右值对象

时间:2022-12-30 18:34:16浏览次数:40  
标签:construct 右值 int destruct c++ && 返回值 ptr

右值测试

结论

  • 返回值不能为右值对象,外面接的人,会那倒一个析构的对象使用。
  • 效率最高的,返回值对象通过引用传入,在函数里面赋值。

代码


#include <iostream>
#include<iostream>
#include<cstdlib>
#include <type_traits>

using namespace std;

template <class _Ty>
_NODISCARD constexpr _Ty&& forwardtt(
	remove_reference_t<_Ty>& _Arg) noexcept { // forward an lvalue as either an lvalue or an rvalue
	return static_cast<_Ty&&>(_Arg);
}

template <class _Ty>
_NODISCARD constexpr _Ty&& forwardtt(remove_reference_t<_Ty>&& _Arg) noexcept { // forward an rvalue as an rvalue
	static_assert(!is_lvalue_reference_v<_Ty>, "bad forward call");
	return static_cast<_Ty&&>(_Arg);
}


void processValue(int& a) { cout << "lvalue" << endl; }
void processValue(int&& a) { cout << "rvalue" << endl; }
template <typename T>
void forwardValue(T&& val)
{
	processValue(forwardtt<T>(val)); //照参数本来的类型进行转发。
}
template <typename T>
void nforwardValue(T&& val)
{
	processValue(val); //照参数本来的类型进行转发。
}
template <typename T>
void moveValue(T&& val)
{
	processValue(std::move(val)); //照参数本来的类型进行转发。
}
void Testdelcl()
{
	int i = 0;
	forwardValue(i); //传入左值 
	forwardValue(0);//传入右值 
	nforwardValue(i); //传入左值 
	nforwardValue(0);//传入右值 
	moveValue(i); //传入左值 
	moveValue(0);//传入右值 
}

using namespace std;

int g_constructCount = 0;
int g_copyConstructCount = 0;
int g_copyRConstructCount = 0;
int g_destructCount = 0;
struct A
{
	A() {
		cout << "construct: " << ++g_constructCount << " ptr:" << this << endl;
	}

	A(const A& a)
	{
		cout << "copy & construct: " << ++g_copyConstructCount << " ptr:" << this << " other:" << &a << endl;
	}

	A(A&& a)
	{
		cout << "copy && construct: " << ++g_copyRConstructCount << " ptr:" << this << " other:" << &a << endl;
	}

	~A()
	{
		cout << "destruct: " << ++g_destructCount << " ptr:" << this << endl;
	}

	void Print()
	{
		cout << "111" << " ptr:" << this << endl;
	}
};

A GetA()
{
	A a = A();

	return a;
}


A&& GetAA()
{
	return A();
}

void GetA(A& a)
{
}


class RTTPrint
{
	public:
		RTTPrint(int number)
		{
			m_number = number;
			cout<< "begin:" << m_number << endl;
		}
		~RTTPrint()
		{
			cout << "end  :"<< m_number << endl;
		}
		int m_number;
};

int main()
{
	int nCounter = 0;
	{
		Testdelcl();
	}
	{
		RTTPrint rtt(nCounter++);
		A a = GetA();
		cout << "haha " << endl;
		a.Print();
	}
	{
		RTTPrint rtt(nCounter++);
		A&& a = GetA();
		cout << "haha " << endl;
		a.Print();
	}
	{
		RTTPrint rtt(nCounter++);
		A b;
		GetA(b);
	}
	{
		RTTPrint rtt(nCounter++);
		A a = GetAA();
	}
	{
		RTTPrint rtt(nCounter++);
		A&& a = GetAA();
		cout << "haha " << endl;
		a.Print();
	}

	
	return 0;
}

输出结果

lvalue
rvalue
lvalue
lvalue
rvalue
rvalue
begin:0
construct: 1 ptr:0135FCEB
copy && construct: 1 ptr:0135FE53 other:0135FCEB
destruct: 1 ptr:0135FCEB
haha
111 ptr:0135FE53
destruct: 2 ptr:0135FE53
end  :0
begin:1
construct: 2 ptr:0135FCEB
copy && construct: 2 ptr:0135FE2F other:0135FCEB
destruct: 3 ptr:0135FCEB
haha
111 ptr:0135FE2F
destruct: 4 ptr:0135FE2F
end  :1
begin:2
construct: 3 ptr:0135FE17
destruct: 5 ptr:0135FE17
end  :2
begin:3
construct: 4 ptr:0135FC33
destruct: 6 ptr:0135FC33
copy && construct: 3 ptr:0135FDFF other:0135FC33
destruct: 7 ptr:0135FDFF
end  :3
begin:4
construct: 5 ptr:0135FC33
destruct: 8 ptr:0135FC33
haha
111 ptr:0135FC33
end  :4

标签:construct,右值,int,destruct,c++,&&,返回值,ptr
From: https://www.cnblogs.com/zijian-yang/p/17015617.html

相关文章

  • 【C++要笑着学】list 核心框架接口的模拟实现 | 运算符重载实现list迭代器 | 妙用模板
       ​​​​​​ ......
  • Linux下c++开发的轻量级、高性能、高并发的web服务器
     代码:WebServer.zip项目描述:通过HTTP协议与客户端(通常是浏览器(Browser))进行通信,来接收、存储、处理来自客户端的HTTP请求,并对其请求做出HTTP响应,返回给客户端其请......
  • C++基础入门
    C++基础入门1C++初识1.1第一个C++程序编写一个C++程序总共分为4个步骤创建项目创建文件编写代码运行程序1.1.1创建项目​ VisualStudio是我们用来编写C++......
  • C/C++商品销售管理系统
    C/C++商品销售管理系统设计一个简单的商品销售管理系统,此系统具备以下功能:(1)商品录入:输入商品的相关信息,字段包括:编号、名称、单价等。(2)商品销售:输入商品编号、销售量。......
  • C++字符串分割字符串
    #include<iostream>#include<vector>std::vector<std::string>split_str(std::string&str,conststd::string&separator){size_tpos=0;std::vecto......
  • pytorch模型onnx部署(python版本,c++版本)
    转载:实践演练BERTPytorch模型转ONNX模型及预测-知乎(zhihu.com)使用bRPC和ONNXRuntime把BERT模型服务化-知乎(zhihu.com)1.安装anaconda一般有图形界面的个人电......
  • 20 万字的 C++ 八股文&图解源码,发布!
    大家好,我是小贺。上周我放言说,这个礼拜整理出「C++八股文 」,给最近秋招季参加面试的读者朋友们,然后就有好几个读者追问小贺的C++八股文啥时候出,从大家的急切的言语中,能......
  • C++11:constexpr关键字
    1.C++常量表达式constexpr是C++11标准新引入的关键字,在学习其具体用法和功能之前,我们需要先搞清楚C++常量表达式的含义。所谓常量表达式,指的就是由多个(≥1)常量组......
  • C++进阶(位图+布隆过滤器的概念和实现+海量数据处理)
    位图概念位图:所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。适用场景:如果我们需要对大量的数据进行处理,判......
  • C++中vector的遍历方法
    假设有这样的一个vector:(注意,这种列表初始化的方法是c++11中新增语法)vector<int>valList={0,1,2,3,4,5,6,7,8,9};需要输出这个vector中的每个元素,测试原......