我注意到代码的安静甚至可以丢掉&符号/参考信号。
QWidget* widget;
func(widget);
以下表达方式是否相同?
func(QWidget* const &widget)
func(QWidget* const widget)
我知道这两个指针都无法修改为可以修改的内容。
关注两者的实际效果的答案将更有价值。
答案 0 :(得分:6)
从右到左阅读定义:
第一个意思是:小部件是对指向QWidget对象的const指针的引用
QWidget* const &widget
第二个意思是: widget是一个指向QWidget对象的const指针
func(QWidget* const widget)
当然他们不一样。
这两个定义都有效,因为编译器会自动取消引用引用。
答案 1 :(得分:1)
单个&符号表示左值引用 - 对超出您使用它的表达式持续存在的值的引用;您可以获取地址的值。
实际结果是,如果传递右值(例如文字),代码将无法编译:
void func_lref(QWidget* const &widget);
void func_val(QWidget* const widget);
void test(QWidget* widget) {
func_val(widget); // OK, pass a copy of the widget parameter by value
func_lref(widget); // OK, pass an l-reference to the widget parameter
func_val(nullptr); // OK, pass a copy of nullptr by value
func_lref(nullptr); // won't compile, a literal can't be l-referenced
}