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)
可能会更好(更便宜)。我在QMap
的insert
方法中看到了这一点。
是的,建议将值传递用于内置类型(以及最近因各种原因在别处争论的较大对象)。传递对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)的主要内容,如果未能解决你的问题,请参考以下文章