C++ 非常量引用的初始值必须是左值

C++ 非常量引用的初始值必须是左值

  • 左值和右值:

在C++中,左值可以出现在赋值语句的左边和右边;右值只能出现在赋值语句的右边,不能出现在赋值语句的左边。变量是左值,常量是右值

有如下的代码:

image-20210319220955844

错误的原因:

  • 按照规则解释:L是常量,既可以放在等号的右边也可以放在等号的左边,属于右值。&L是L的地址,地址只能放在等号的左边,是不可以被改变的,属于左值。而函数中对应的形参是非常量引用,所以无法赋值。当我们把形参变成常量引用后就是正确的

    image-20210319222325212
  • 根本原因是什么?

    只允许将常量传递给常量引用,如果将常量传递给非常量引用,我们就有可能通过引用去修改常量。这显然是不能被允许的。

    SqList*const & L意味着声明了一个SqList指针类型的引用,而const在*后面,修饰&L,即&L不可改变,也就是不可以通过L修改它引用的内容。所以此时可以传递常量给它。

    BTW,const SqList*&L以及 SqList const*&L中,const在*的前面,意味着const修饰的是 *&L,即 *&L的内容不可改变,也就是L引用的指针所指向的值不可改变。

    同理。SqList*const L中,const是对L的修饰,意味着指针L的值不可改变,即L的指向不可改变。

    const SqList* L中,const是对*L的修饰,意味着 *L的值不可改变,即L指向的内容的值不可改变。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值