2016-07-04 83 views
2

我注意到代碼的和平工作甚至扔掉&符號/參考信號。func(QWidget * const&Widget)VS func(QWidget * const Widget)

QWidget* widget; 
func(widget); 

以下表達式是否意味着相同?

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

我明白這兩個都是指針,不能修改的東西,可以修改。

專注於兩者實際效果的答案將更有價值。

+1

它可能_work,但它也拷貝'按值widget'。對於非基本類型,該副本可能會非常昂貴,但對於基本類型(如指針)可能稍微便宜一些。兩者都有不同的用途。 –

+0

有趣的是,func(QWidget * const widget)可能會更好(更便宜)。我在'QMap'的'insert'方法中看到了這一點。 – KcFnMi

+1

是的,對於內置類型(以及最近更大的對象,由於其他各種原因而進行辯論),建議使用傳值。傳遞給一個'const'指針的引用是,赦免雙關語,毫無意義。如果你想讓你的函數以調用者可以觀察的方式更新指針,那麼這裏的唯一用於引用的參數是非''const'',即作爲輸出參數。 –

回答

6

閱讀定義從右到左:

第一裝置:小部件是一個const指針的引用到一個QWidget對象

QWidget* const &widget 

第二裝置:小部件是一個常量指針到一個QWidget對象

func(QWidget* const widget) 

當然它們不是相同的。

這兩個定義都起作用,因爲引用自動被編譯器取消引用。

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 
}