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

Posted

技术标签:

【中文标题】func(QWidget* const &widget) VS func(QWidget* const widget)【英文标题】: 【发布时间】:2016-07-04 15:28:25 【问题描述】:

我注意到即使丢弃与号/参考信号,代码也能正常工作。

QWidget* widget;
func(widget);

以下表达的意思是一样的吗?

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

我知道两者都是不能修改的指针,指向可以修改的东西。

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

【问题讨论】:

它可能会起作用,但它也会按值复制widget。对于非基本类型,该副本可能会非常昂贵,但对于诸如指针之类的基本类型可能会稍微便宜一些。两者都有不同的用途。 很有趣,所以func(QWidget* const widget) 可能会更好(更便宜)。我在QMapinsert 方法中看到了这一点。 是的,建议将值传递用于内置类型(以及最近因各种原因在别处争论的较大对象)。传递对const 指针的引用是,请原谅双关语,毫无意义。如果你想让你的函数以调用者可以观察到的方式更新指针,这里引用的唯一用途是非const,即作为输出参数。 通过引用传递指针只有在这个指针被函数修改时才有意义(const 指针不是这种情况)。通过副本传递指针在某些情况下更简单、更安全且更便宜。 【参考方案1】:

从右到左阅读定义:

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

QWidget* const &widget

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

func(QWidget* const widget)

当然它们不一样。

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于func(QWidget* const &widget) VS func(QWidget* const widget)的主要内容,如果未能解决你的问题,请参考以下文章

const int& 是不是传递了引用或副本

Const限定符和前向引用

const与指针

C++ const 语义供参考

c++ 函数:将非 const 参数传递给 const 引用参数

qt setfixedsize有啥用