本帖最后由 luvmdy 于 2019-1-9 16:44 编辑
你的问题和这个应该和这个有异曲同工之处“initial value of reference to non-const must be an lvalue”。
以下述为例:Record lookup(Account&);
Record lookup(const Account&);
首先,如果你在形参列表里放的是左值,那很好,两种声明都不会报错。但,如果你放一个右值在形参列表里,那么第一种声明就会报错,错误信息就是第一句话。因此第二种声明是特别针对形参列表放右值的。
或许你有点疑惑有些右值不是可以被赋值吗?对,是可以被赋值,但这种赋值之后的结果是不可预测的,编译和链接能通过,但结果不对。你应该时刻记住右值只能出现在赋值操作符的右边,那么,你的形参列表里就应该加上const
举个栗子:class Keyboard
{
enum keys
{
W=0x01;
S=0x02;
}
bool IsKeyDown(keys& key){//实现不重要...}
bool IsKeyDownMod(const keys& key){//实现不重要...}
};
int main(void)
{
Keyboard keyboard;
keyboard.IskeyDown(Keyboard::W); //报错:initial value of reference to non-const must be an lvalue
keyboard.IskeyDowModn(Keyboard::W); //不报错,因为Keyboard::W是右值
}
我自己封装的键盘类有七八百行代码,以上代码是从我的项目中精简出来的,但你的这个问题也确实是我在封装自己的键盘类中遇到的。因此,你可以参考这个栗子去理解为啥这两种声明不一样。
再次声明:这个精简的代码我没有测试能不能运行,至少还原回七八百行状态后是编译通过的。你只要理解我说的左值右值问题就行了。
另外,C++ Primer这本书很好,里面引入了大量C++2.0的特性,因此理解上有困难是正常的,建议搭配其他低档点的C++书一起看效果更佳。但这本书对于对象模型讲的不多,如果对于很喜欢探究内存的小伙伴,建议看看C++对象模型方面的书,侯捷老师有翻译过,记得他翻译了两版,一般是03年的,一版是12年的
|