关于右值引用,为什么输出结果是这样?

周成风 周成风 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#include "stdafx.h"
#include <iostream>

using namespace std;

int g_constructCount = 0;
int g_copyConstructCount = 0;
int g_destructCount = 0;
struct A
{
A() { cout << "construct: " << ++g_constructCount << endl; }
A(const A& a) { cout << "copy construct: " << ++g_copyConstructCount << endl; }
~A() { cout << "destruct: " << ++g_destructCount << endl; }
void Output() { cout << "A" << endl; }
};
A GetA(int iType)
{
if (iType == 0)
{
A a1;
return a1;
}
else
{
A a2;
return a2;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
A&& a = GetA(0);
a.Output();

return 0;
}

VS2013,Release的输出结果:
construct: 1
copy construct: 1
destruct: 1
A
destruct: 2

本以只会调用一次构造函数,一次析构函数,但输出结果中出现了拷贝构造函数,是什么原因呢?
...全文

相关推荐

C++箴言:让=返回一个this的引用

本文给大家分享了C++箴言:让=返回一个this的引用。

weixin_38711149

浅谈C++左值引用和右值引用

下面小编就为大家带来一篇浅谈C++左值引用和右值引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

weixin_38686041

C++11中的左值引用和右值引用

1.首先区分左值和右值   左值是表达式结束后依然存在的持久对象   右值是表达式结束时不再存在的临时对象   便捷方法:对表达式取地址,如果能,则为左值,否则为右值   举例:   int a = 10   int b = 20   int *pFlag = &a   vector vctTemp   vctTemp.push_back(1)   string str1 = "hello"   string str2 = "world"   const int &m = 1   请问:a,b,a+b,a++,++a,pFlag,vctTemp[0],100

weixin_38682953

关于c++的 右值 右值引用 move

简介 第一次接触c++move操作就懵逼了,一直想探个究竟,但是右值以及右值引用思考了好长时间,就是不得要领,今天终于有所收获,写下第一篇博客,一方面为了帮助一些刚入门的朋友,另一方面也是帮助自己今后复习。 右值 左值 右值引用 左值引用 含义 左值是一个持久的量,右值是一个短暂的量。那怎么算持久怎么算短暂呢?取决于我的代码里有没有一个变量来保存他。举个例子: int i = 5; string s1(“ppap”); 都可以完成取地址的操作的操作 &i,&si; 那么定义一个左值引用,就是给这些地址起一个其他的名字罢了,地址是不会发生变化的,也就是说左值引用的本质其实还是指针: int &

weixin_38687199

浅析C++11中的右值引用、转移语义和完美转发

对于c++11来说移动语义是一个重要的概念,一直以来我对这个概念都似懂非懂。最近翻翻资料感觉突然开窍,因此顺便记录下C++11中的右值引用、转移语义和完美转发,方便大家查阅参考。

weixin_38546789
评论 18
收藏 已收藏
分享
返回顶部
周成风
C++ 语言 65,214 成员 250,514 内容