C++ 非常量引用的初始值必须是左值
-
左值和右值:
在C++中,左值可以出现在赋值语句的左边和右边;右值只能出现在赋值语句的右边,不能出现在赋值语句的左边。变量是左值,常量是右值。
有如下的代码:
错误的原因:
-
按照规则解释:L是常量,既可以放在等号的右边也可以放在等号的左边,属于右值。&L是L的地址,地址只能放在等号的左边,是不可以被改变的,属于左值。而函数中对应的形参是非常量引用,所以无法赋值。当我们把形参变成常量引用后就是正确的
-
根本原因是什么?
只允许将常量传递给常量引用,如果将常量传递给非常量引用,我们就有可能通过引用去修改常量。这显然是不能被允许的。
而
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指向的内容的值不可改变。