临时对象也能被修改?

we_sky2008 2010-01-11 03:03:51

临时对象怎么也可以被赋值?
例如:
#include<iostream>

using namespace std;

class A
{
public:
A(int x = 0) : a(x){}

A& operator=(const A& other)
{
a = other.a;
return *this;
}
private:
int a;
};

A function(A& other)//返回值的类型是A
{
return other;
}

int main()
{
A a1(123);

function(a1) = a1;

system("pause");
return 0;
}
...全文
392 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
email_zixuan 2010-01-11
  • 打赏
  • 举报
回复
内置类型的对象是不是因为放在寄存器中而无法取地址
pywepe 2010-01-11
  • 打赏
  • 举报
回复
顶上去
we_sky2008 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 supermegaboy 的回复:]
5分钟。

右值与只读没有关系,只读的也可以是左值。
[/Quote]
刚才我试了下发现:
临时对象是可以取其地址的
而内置类型的临时对象是不可以取地址的
这也许就是自定义类型的临时对象和内置类型临时对象的差别的原因吧?
taodm 2010-01-11
  • 打赏
  • 举报
回复
在网上,直接给自己的“理解”的,属误导的实在比例太大了。
我只敢指出比较权威的出处,免得误导别人。
candeabc123 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 we_sky2008 的回复:]
引用 22 楼 taodm 的回复:
那我也得知道答案啊。你不会看标准,难道我就会看呀,我更懒。
引用 16 楼 candeabc123 的回复:
引用 12 楼 taodm 的回复:
如果你真想知道权威答案,恐怕还得翻C++标准。

既然知道就应该告诉人家啊   默契的很  装什么装呢

你完全可以先告诉别人你的理解 然后再说:想深入理解,再看看。。。。
拜托大师不要老是这样了,不是每个人想看什么就可以看什么的。


呵呵,
两位莫生气!
要河蟹。
[/Quote]
没有了 我只是建议而已 建议而已
eatsweetpotato 2010-01-11
  • 打赏
  • 举报
回复
引用
楼主这个问题问得好!但楼主在这个问题上有不少错误的理解。

每个类都有一个隐含或自定义的赋值操作符重载,这个赋值操作符重载与一般内置类型的赋值操作符是不同的,内置赋值操作符的左操作数要求是左值,但赋值操作符重载并不要求是左值,下面摘录C++标准的内容:


13.5 Overloaded operators

The identities among certain predefined operators applied to basic types (for example, ++a ≡ a+=1) need not hold for operator functions. Some predefined operators, such as +=, require an operand to be an lvalue when applied to basic types; this is not required by operator functions.

function返回一个A类对象,这是一个右值类对象,不用对右值类对象这种东西感到奇怪,C++与C的左值右值概念是不同的,C++中的左值不一定是对象,而右值也不一定不是对象。

由于function返回的是一个右值类对象,于是那个=使用的不是用于内置类型的赋值操作符,而是赋值操作符重载,并不要求左值,是这个原因使表达式function(a1) = a1成立。


受教了
we_sky2008 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 taodm 的回复:]
自卫亭大侠闭关后,极难有人肯去看标准原文了。
不知道supermegaboy是花了多久找出来的,赞一下!
[/Quote]
呵呵
还是标准有说服力(奶奶的,“说服”这个词啥时候又变成shuo fu了 我记得以前是shui fu的)
飞天御剑流 2010-01-11
  • 打赏
  • 举报
回复
5分钟。

右值与只读没有关系,只读的也可以是左值。
taodm 2010-01-11
  • 打赏
  • 举报
回复
自卫亭大侠闭关后,极难有人肯去看标准原文了。
不知道supermegaboy是花了多久找出来的,赞一下!
we_sky2008 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 supermegaboy 的回复:]
引用楼主 we_sky2008 的回复:
临时对象怎么也可以被赋值?
例如:
#include <iostream>

using namespace std;

class A
{
public:
    A(int x = 0) : a(x){}
     
    A& operator=(const A& other)
    {
        a = other.a;
        return *this;
    }
private:
    int a;
};

A function(A& other)//返回值的类型是A
{
    return other;
}

int main()
{
    A a1(123);
   
    function(a1) = a1;
   
    system("pause");
    return 0;
}


楼主这个问题问得好!但楼主在这个问题上有不少错误的理解。

每个类都有一个隐含或自定义的赋值操作符重载,这个赋值操作符重载与一般内置类型的赋值操作符是不同的,内置赋值操作符的左操作数要求是左值,但赋值操作符重载并不要求是左值,下面摘录C++标准的内容:


13.5 Overloaded operators

The identities among certain predefined operators applied to basic types (for example, ++a ≡ a+=1) need not hold for operator functions. Some predefined operators, such as +=, require an operand to be an lvalue when applied to basic types; this is not required by operator functions.

function返回一个A类对象,这是一个右值类对象,不用对右值类对象这种东西感到奇怪,C++与C的左值右值概念是不同的,C++中的左值不一定是对象,而右值也不一定不是对象。

由于function返回的是一个右值类对象,于是那个=使用的不是用于内置类型的赋值操作符,而是赋值操作符重载,并不要求左值,是这个原因使表达式function(a1) = a1成立。
[/Quote]
谢谢这位大哥,
我原先的理解是右值只能用来读的(所以我才将临时对象理解为const的)
we_sky2008 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 taodm 的回复:]
那我也得知道答案啊。你不会看标准,难道我就会看呀,我更懒。
引用 16 楼 candeabc123 的回复:
引用 12 楼 taodm 的回复:
如果你真想知道权威答案,恐怕还得翻C++标准。

既然知道就应该告诉人家啊   默契的很  装什么装呢

你完全可以先告诉别人你的理解 然后再说:想深入理解,再看看。。。。
拜托大师不要老是这样了,不是每个人想看什么就可以看什么的。

[/Quote]
呵呵,
两位莫生气!
要河蟹。
飞天御剑流 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 we_sky2008 的回复:]
临时对象怎么也可以被赋值?
例如:
#include <iostream>

using namespace std;

class A
{
public:
    A(int x = 0) : a(x){}
     
    A& operator=(const A& other)
    {
        a = other.a;
        return *this;
    }
private:
    int a;
};

A function(A& other)//返回值的类型是A
{
    return other;
}

int main()
{
    A a1(123);
   
    function(a1) = a1;
   
    system("pause");
    return 0;
}
[/Quote]

楼主这个问题问得好!但楼主在这个问题上有不少错误的理解。

每个类都有一个隐含或自定义的赋值操作符重载,这个赋值操作符重载与一般内置类型的赋值操作符是不同的,内置赋值操作符的左操作数要求是左值,但赋值操作符重载并不要求是左值,下面摘录C++标准的内容:


13.5 Overloaded operators

The identities among certain predefined operators applied to basic types (for example, ++a ≡ a+=1) need not hold for operator functions. Some predefined operators, such as +=, require an operand to be an lvalue when applied to basic types; this is not required by operator functions.

function返回一个A类对象,这是一个右值类对象,不用对右值类对象这种东西感到奇怪,C++与C的左值右值概念是不同的,C++中的左值不一定是对象,而右值也不一定不是对象。

由于function返回的是一个右值类对象,于是那个=使用的不是用于内置类型的赋值操作符,而是赋值操作符重载,并不要求左值,是这个原因使表达式function(a1) = a1成立。
ljuncong 2010-01-11
  • 打赏
  • 举报
回复
错的;

值不能赋予值的,值只能赋予给变量!A function(a) 返回的是值,这个返回值是暂时保管于某个位置,这个位置就是临时变量,而function()的调用得出的是值,并不是变量,所以不能用function()= a 的方式。
macrojj 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 ilwmin 的回复:]
那只是一个形参,其实你传进去的是A的一个引用,返回的也是A的引用,关临时对象什么事?

个人愚见.
[/Quote]

很明显 不是啊

我觉得是内建对象 和 自定义对象 的差别吧
taodm 2010-01-11
  • 打赏
  • 举报
回复
那我也得知道答案啊。你不会看标准,难道我就会看呀,我更懒。
[Quote=引用 16 楼 candeabc123 的回复:]
引用 12 楼 taodm 的回复:
如果你真想知道权威答案,恐怕还得翻C++标准。

既然知道就应该告诉人家啊  默契的很  装什么装呢

你完全可以先告诉别人你的理解 然后再说:想深入理解,再看看。。。。
拜托大师不要老是这样了,不是每个人想看什么就可以看什么的。
[/Quote]
ilwmin 2010-01-11
  • 打赏
  • 举报
回复
那只是一个形参,其实你传进去的是A的一个引用,返回的也是A的引用,关临时对象什么事?

个人愚见.
we_sky2008 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 macrojj 的回复:]
引用 17 楼 we_sky2008 的回复:
引用 14 楼 macrojj 的回复:
细细 我猜你用的vc6.0

vs 2008是要报错的

我还是真的用的VC6呢
这个...


我刚刚说错了不是编译器原因哈。。。

[/Quote]
问晚了一步
这....
we_sky2008 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 macrojj 的回复:]
细细 我猜你用的vc6.0

vs 2008是要报错的
[/Quote]
报的什么错?
莫非临时变量真的是我所理解的const?
谢谢!
macrojj 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 we_sky2008 的回复:]
引用 14 楼 macrojj 的回复:
细细 我猜你用的vc6.0

vs 2008是要报错的

我还是真的用的VC6呢
这个...
[/Quote]

我刚刚说错了不是编译器原因哈。。。
we_sky2008 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 macrojj 的回复:]
细细 我猜你用的vc6.0

vs 2008是要报错的
[/Quote]
我还是真的用的VC6呢
这个...
加载更多回复(16)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧