64,640
社区成员
发帖
与我相关
我的任务
分享
class A;
A func()
{
A a;
return a;
}
int main()
{
A *a = &func(); // s1
A &a = func(); // s2
return 0;
}
#include <iostream>
using namespace std;
#include "version.h"
int g_obj = 0;
class A
{
public:
A()
{
p = new char[20];
g_obj++;
cout<<"A() g_obj="<<g_obj<<endl;
}
~A()
{
delete[] p;
g_obj--;
cout<<"~A() g_obj="<<g_obj<<endl;
}
char*p;
};
A func()
{
A a;
return a;
}
int main()
{
{
A *a1 = &func(); // s1
A &a2 = func(); // s2
}
return 0;
}
以上代码会报错,说明lz的这种调用方式存在的大问题
试试
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A is created"<<endl;
}
void show()
{
cout<<"show something"<<endl;
}
};
A func()
{
A a;
return a;
}
int main()
{
A b;
func() = b;
func().show();
return 0;
}
请告诉我,如果不是c++ 11的非常量右值引用,这个程序怎么通过的?
[/quote]
(1) 这个例子能通过和主楼程序的错误没有任何关系。
(2) 这个例子的正确性不需要 c++11 支持,c++03 的编译器也能够正确编译该程序。
主楼程序错误的原因在于
A *a = &func(); // s1
A &a = func(); // s2
& 只能作用于左值上,A& 只能绑定于非常量左值上。
你给的例子中没有涉及这两个概念中的任何一个,典型的混淆视听。
你在 #12 的主要观点是认为主楼程序是正确的,是受 c++11 支持的。你抱着个"非常两右值引用"的概念忽悠,这也是我看着不爽的原因,实际上主楼程序就没有右值引用,只有右值对象,也叫临时对象。[/quote]
如果能对 右值对象或者临时对象 取地址并且操作,都是右值引用的概念,这个是c++ 11才提出来的。这只是一个概念,不是说,一定要用引用来取,用指针也一样的。
你在c++ 98或者c++ 03上,能对 右值对象 或者 临时对象 取地址?
我还看你不爽呢,自以为有点经验,被别人指出了错误,恼羞成怒了,还不如回去好好看看书。
你可以参考http://skyscribe.github.io/blog/2012/08/19/c-plus-plus-11xin-te-xing-rvalue-reference-and-and-move/这篇文章。[/quote]
呵呵,你搞笑了。你看我不爽没关系,任何人都可以看我不爽。
问题是你号称指出了我的错误,搞来搞去也没说明白我到底那里错了,到是你陈述里被我挑出错误了,要么就是故左右而言它竟说些不相关的。
我从来没说过能对右值对象取地址,这种错误的观点是你强行派给我的,实际上我始终在说取地址只能对左值。目测你为了证明我错了,看来是主动忽略了。
我也用不着恼羞成怒,如果我真的错了,我会很痛快的承认的,任何有兴趣的都可以翻翻我在 csdn 的回帖记录,看看我承认错误的记录。倒是你让我觉得不愿意承认自己错了。[/quote]
我说了,那个只是我的一个失误,打字太快,没有回头看,上面我都sorry了,难不成你没看到?
我的意思就明摆着,c++ 11支持了对 右值引用,这个也是楼主出现的疑问,他说vs2010能通过,codeblocks不能通过。我的回答是,vs2010要么就是利用的c++ 11的特性,要么私自支持了这个特性。codeblocks升级到最新版本也应该可以支持,只要支持c++ 11的都可以。
但您的问题呢,死命说 这不是 c++ 11的右值引用,右值引用的操作数必须是左值。
看你这句话,& 只能作用于左值上,A& 只能绑定于非常量左值上。
而且我一再说“右值引用”只是概念,这要对 右值 能取到地址,都是这个概念的范畴。
再看看我在16#的例子,还需要说明么?真搞笑,您年纪多大了,技术不咋地,脾气跟个老学究一样。看不懂新技术,就不要出来丢人,可以去google搜索一下。就你这样的,我见多了,仗着自己有几年经验,死抱着久规则不放,天天跟怨妇一样,抱怨外面的技术怎么更新这么快。
[/quote]
右值引用是&&
你对一个右值去用&来引用是不行的
你真的知道什么是右值引用吗?