我注意到代碼的和平工作甚至扔掉&符號/參考信號。func(QWidget * const&Widget)VS func(QWidget * const Widget)
QWidget* widget;
func(widget);
以下表達式是否意味着相同?
func(QWidget* const &widget)
func(QWidget* const widget)
我明白這兩個都是指針,不能修改的東西,可以修改。
專注於兩者實際效果的答案將更有價值。
我注意到代碼的和平工作甚至扔掉&符號/參考信號。func(QWidget * const&Widget)VS func(QWidget * const Widget)
QWidget* widget;
func(widget);
以下表達式是否意味着相同?
func(QWidget* const &widget)
func(QWidget* const widget)
我明白這兩個都是指針,不能修改的東西,可以修改。
專注於兩者實際效果的答案將更有價值。
閱讀定義從右到左:
第一裝置:小部件是一個const指針的引用到一個QWidget對象
QWidget* const &widget
第二裝置:小部件是一個常量指針到一個QWidget對象
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
}
它可能_work,但它也拷貝'按值widget'。對於非基本類型,該副本可能會非常昂貴,但對於基本類型(如指針)可能稍微便宜一些。兩者都有不同的用途。 –
有趣的是,func(QWidget * const widget)可能會更好(更便宜)。我在'QMap'的'insert'方法中看到了這一點。 – KcFnMi
是的,對於內置類型(以及最近更大的對象,由於其他各種原因而進行辯論),建議使用傳值。傳遞給一個'const'指針的引用是,赦免雙關語,毫無意義。如果你想讓你的函數以調用者可以觀察的方式更新指針,那麼這裏的唯一用於引用的參數是非''const'',即作爲輸出參數。 –