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

时间:2016-07-04 15:28:25

标签: c++ qt c++11 qt5 qmap

我注意到代码的安静甚至可以丢掉&符号/参考信号。

QWidget* widget;
func(widget);

以下表达方式是否相同?

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

我知道这两个指针都无法修改为可以修改的内容。

关注两者的实际效果的答案将更有价值。

2 个答案:

答案 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
}