func(QWidget* const &widget) VS func(QWidget* const 小部件)

func(QWidget* const &widget) VS func(QWidget* const widget)

我注意到即使丢弃 ampersand/reference 信号也能正常工作。

QWidget* widget;
func(widget);

下列表达的意思相同吗?

func(QWidget* const &widget)
func(QWidget* const widget)

我理解两者都是不能修改的指向可以修改的东西的指针。

注重两者实际效果的回答会更有价值。

从右到左阅读定义:

第一种意思是:widget是一个指向QWidget对象的const指针的引用

QWidget* const &widget

第二种意思:widget是一个指向QWidget对象的const指针

func(QWidget* const widget)

当然不一样

这两个定义都有效,因为引用会被编译器自动取消引用。

单个 & 符号表示左值引用 - 对在您使用它的表达式之外持续存在的值的引用;您可以获取地址的值。

实际结果是,如果您传递右值(例如文字),代码将无法编译:

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
}