一个函数返回左值的问题

letmeflee 2007-07-26 11:25:04
请问函数返回值 哪些情况下是左值 哪些情况下是右值
数上说 函数返回引用和指针都是左值
可是 我用
class dh
{
public :
dh operator*(dh g)
{
dh gg;
gg.x = g.x * x;
return gg;
}

dh(){x = 0;}
int x;
};

dh fff()
{
dh h;
return h;
}
int main(int argc, char* argv[])
{
dh g;
fff() = g;
return 0;
}
我返回的事对象 再vc6下面编译也不会出错拿
...全文
297 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
subsars 2007-07-27
  • 打赏
  • 举报
回复
被读取的值是右值
存储数据值得内存的地址是左值
letmeflee 2007-07-27
  • 打赏
  • 举报
回复
对象可以作为左值码
Vitin 2007-07-27
  • 打赏
  • 举报
回复
C++ Standard [basic.lval] 5
The result of calling a function that does not return a reference is an rvalue.The result of calling a function that does not return a reference is an rvalue. User defined operators are functions, and whether such operators expect or yield lvalues is determined by their parameter and return types.

所以函数的返回值只要不是引用,就都是rvalue。
如果使用基本类型做测试,可以得到f() = g;的错误信息。

但是在 fff() = g; 中,因为dh是用户定义的类型,那么它的赋值函数也是由用户定义的(由于用户没有显式定义,编译器隐式定义了一个)。所以,这里不需要fff()的返回值是左值了。
编译器隐式定义的赋值函数,其原型可以认为是dh& dh::operator=(const dh& g),fff()的返回值完全可以调用它。所以编译正确。
至于const dh fff_const(); 只要你定义如下原型的赋值函数:
const dh& dh::operator=(const dh& g) const;
这样 fff_const() = g; 也可以编译通过,因为const dh可以调用如上的赋值函数。

总之对用户定义类型,赋值的成立条件可以由用户自行决定,而不必遵循语言为基本类型制订的的规则。

hoya5121 2007-07-27
  • 打赏
  • 举报
回复
函数返回值可以存储变量嘛?
mymtom 2007-07-26
  • 打赏
  • 举报
回复
纯粹讨论语法。
R9R9R9 2007-07-26
  • 打赏
  • 举报
回复
编译不出错又不代表就是正确的!

fff() = g;
对一个临时变量赋值有什么意义呢?
mymtom 2007-07-26
  • 打赏
  • 举报
回复
当然不会出错了fff返回的是一个对象,可以被做左值!但是如果为const对象就不能赋值了。
mymtom@fc6:src/csdn/cpp$ cat lval.cpp
class dh
{
public :
dh operator*(dh g)
{
dh gg;
gg.x = g.x * x;
return gg;
}

dh(){x = 0;}
int x;
};

dh fff()
{
dh h;
return h;
}

const dh fff_const()
{
dh h;
return h;
}
int main(int argc, char* argv[])
{
dh g;
fff() = g;
fff_const = g;
return 0;
}

mymtom@fc6:src/csdn/cpp$ make lval
g++ -O0 lval.cpp -o lval
lval.cpp: In function 'int main(int, char**)':
lval.cpp:30: error: assignment of function 'const dh fff_const()'
lval.cpp:30: error: cannot convert 'dh' to 'const dh ()()' in assignment
make: *** [lval] Error 1
mymtom@fc6:src/csdn/cpp$

64,652

社区成员

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

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