2012-06-08 20 views
3

這是來自Calling constructor in return statement的後續問題。NRVO病例中常量返回類型的相關性

這是一個運算符在類中超載的樂趣。

const Integer operator+(const Integer& IntObject) 
{ 
    cout << "Data : " << this->data << endl; 
    return Integer(this->data + IntObject.data); 
} 

const在返回類型中對這些函數的相關性是什麼?

int main() 
{ 
    Integer A(1); //Create 2 object of class Integer 

    Integer B(2); 

    const Integer C = A + B; //This will work 

    Integer D = A + B;  //This will also work 

    fun(A + B);    //Will work 
} 

void fun(Integer F) {} 

這是一種情況,由於NRVO,在返回步驟中不會創建臨時對象。要返回的對象直接構造在被調用者的地址上。

回答

3

您的代碼片段中沒有任何相關性,因爲您正在製作返回值的副本

一般而言,很難找到返回const值的很好理由。我只能看到具有這種表達的效果呢,嘗試調用非const方法上const臨時:

(someObject.someMethodReturningConstValue()).someNonConstMethod(); // error, calls non const method on const temporary 

所以如果你希望禁止調用非const方法,你應該只使用它在臨時。另一方面,它殺死了C++ 11中的移動語義,所以不鼓勵。

8

這裏有一個更好的例子:

struct Foo 
{ 
    void gizmo(); 
    Foo const operator+(Foo const & rhs); 
}; 

現在,如果你有一個Foo x; Foo y;,那麼你無法說:

(x + y).gizmo(); // error! 

恆定的返回值意味着你不能將它用於非恆操作。對於原始類型來說,這並不太相關,因爲可以在臨時對象上執行的非常量操作並不多,因爲很多「有趣」操作(如前綴++)在臨時對象上是不允許的。

這就是說,在C++ 11中,應該真正嘗試採用永不返回常量值的新成語,因爲非常量值現在可以用來優化優化。

+0

從所有的答案,我得到的const返回類型是/在這種情況下,用於防止修改在'return'期間創建的臨時對象(如果有的話)的行動。而根據C++ 11,我應該避免在這種情況下使用const返回類型? – hackrock

+2

@rocky如果你想防止在臨時對象上調用non-const,那麼你並沒有真正的選擇,這意味着如果適用的話,你不會從移動語義中受益。 – juanchopanza

4

有些人曾經建議這樣做,以防止像A + B = C這樣的廢話。但是,在C++ 11中,它可以阻止某些優化,因爲它使得返回值不可移動。因此,你不應該這樣做。

在這種情況下,它也會阻止您編寫完全有效的代碼,如D = A + B + C,但這是因爲作者忘記聲明運算符const