码迷,mamicode.com
首页 > 其他好文 > 详细

关于非常量引用的初始值必须为左值的问题

时间:2020-04-16 15:23:05      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:不能   style   表示   返回值   那是   c++   bsp   估计   改变   

首先 我现在编写一个代码时出现了一个问题代码如下

Spritestone& Monster::getValue()
{
    int stoneCount[] = { 100,200,500,1000,2000,5000,10000,20000,100000 };
    int value = stoneCount[level - 1];

    return SpriteStone(value, SpriteStoneLevel::PRIMARY_LEVEL);
}

就是Monster对象中有一个getValue方法用Spritestone(灵石)来估计Monster的价值,返回值是Spritestone的引用,在函数内部我的返回值是用SpriteStone的构造函数狗构造出的一个对象,但是代码却报错提示:非常量引用的初始值必须为左值,仔细一看原来是函数返回值是一个类的引用的问题,下面总结如下:

 

首先了解一个东西叫做左值与右值。

所谓左值,就是C/C++中可以放在赋值符号左边的变量,表示存储在内存的对象,相当于地址值,而右值则是当一个符号或者常量放在操作符右边的时候,计算机就读他们的右值也就是他们的真实值。简言之,左值就是地址值,而右值就是真实值。

 

然后要明白一点我们在定义一个东西的引用时,这个东西只能是常量而不能是常量,比方说有这样的代码

int& a = 1;
    a = 2

这显然是不合理的,因为如果允许使用常量作为左值的话,改变了a的值,同时1的值也要修改,这是错误的。

 

再来看 上边最开始的代码,函数要求返回值的类型是返回值是Spritestone的引用,而我在函数的末尾返回了

SpriteStone(value, SpriteStoneLevel::PRIMARY_LEVEL),而这个东西是个临时变量,他的生命周期在函数结束后就要结束了,如果返回一个引用,后面如果改变引用的值得话,那是不是这个临时变量也要改变呢,显然不合理,自然会报错,非常量引用的初始值必须为左值,因此,解决方案是,将函数的返回值由Spritestone的引用
改为SpriteStone即可:
SpriteStone Monster::getValue()
{
    int stoneCount[] = { 100,200,500,1000,2000,5000,10000,20000,100000 };
    int value = stoneCount[level - 1];
    return SpriteStone(value, SpriteStoneLevel::PRIMARY_LEVEL);
}

 

关于非常量引用的初始值必须为左值的问题

标签:不能   style   表示   返回值   那是   c++   bsp   估计   改变   

原文地址:https://www.cnblogs.com/Ybossy/p/12712672.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!