2014-02-28 137 views
1

嗨,大家好一些問題就在這裏:c + +返回本地或臨時變量

這裏是我的重載操作符:

const double & Waz::operator()(int i,int j) const 
{ 
return ((WazImpl const)(*p))(i,j); 
} 

凡在WAZ I類有:WazImpl * P;而在類WazImpl我有一個operator()

的警告是: 警告C4172局部變量的返回地址或臨時

據我瞭解,我回國這是破壞其他地方的臨時變量我能做些什麼來解決它?

謝謝!

+1

* p表示什麼? –

+0

'WasImp :: operator()(int,int)'的實現是什麼? –

+0

避免C-cast。 (我認爲它應該是'(WazImpl const&)(* p)',參考) – Jarod42

回答

0

您應該向我們展示WazImpl的實現,但似乎WazImpl::operator() const返回double

這意味着((WazImpl const)(*p))(i,j)返回一個臨時值(它只存在於Waz :: operator()的範圍內)。
由於Waz::operator()返回一個double &,您確實返回了臨時引用。

無論你是返回的是剛剛在WazImpl::operator()計算臨時值,那麼你應該返回Waz::operator()一個double要麼你真的在WazImpl返回到現有的雙參考,你應該解決的WazImpl::operator() const,使其返回簽名一個const double&

1

你有兩種可能性。第一種是簡單地返回double代替參考const double &

double Waz::operator()(int i,int j) const 
{ 
    return ((WazImpl const)(*p))(i,j); 
} 

第二個是與基準返回到提供的原始值被呼叫操作者也返回const引用加倍的

const double & Waz::operator()(int i,int j) const 
{ 
    const double &rd = (WazImpl const)(*p))(i,j); 

    return rd; 
} 

這裏是一個簡單的例子,演示第二種方法

#include <iostream> 

struct A 
{ 
    int & operator()(){ return a; } 
    int a = 10; 
}; 

struct B : A 
{ 
    int & operator()() 
    { 
     int &ri = A::operator()(); 
     return ri; 
    } 
}; 

int main() 
{ 
    B b; 

    b() = 20; 

    std::cout << b.a << std::endl; 


    return 0; 
} 
+0

你的第二個選項不會改變任何東西。如果'(WazImpl const)(* p))(i,j)'返回一個臨時值,那麼'Waz :: operator()'仍然返回一個臨時引用。 – log0

+0

@ log0我寫道,只要被調用的操作符也返回const引用。 –

+0

好吧,我看到了,但應該清楚,你的第二個「選項」實際上與問題中的代碼做了相同的事情。我認爲我們同意這個問題是在執行'WazImpl'。 – log0

3

如果你解剖的功能,你可以看到它等同於以下內容:

const double& Waz::operator()(int i, int j) const { 
    // Cast pointer to callable. 
    const WazImpl& wi = static_cast<const WazImpl>(*p); 

    // Get result of calling callable. 
    double d = wi(i, j); 

    // Return REFERENCE to local object. 
    return d; 
} // All local objects is destroyed and references to them become dangling. 

所以,你確實呼喚你Waz::operator時得到一個懸空的參考。

一種解決方案是返回這將返回一個副本的結果。也不要返回const value,因爲它毫無意義。

double Waz::operator()(int i, int j) const;