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

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

本文关键字:widget func const QWidget VS      更新时间:2023-10-16

我注意到即使丢掉&号/引用信号,代码也能正常工作。

QWidget* widget;
func(widget);

下列表达式的意思相同吗?

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

我理解它们都是指针,不能被修改成可以修改的东西。

关注两者的实际效果会更有价值。

从右至左阅读定义:

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

QWidget* const &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
}