double& squaredX (double x)
{
return x*x;
}
- 這個函數的潛在問題是什麼?
- 什麼是重寫函數的最好方法?
double& squaredX (double x)
{
return x*x;
}
它不會編譯,因爲你不能綁定一個非const引用到一個臨時的(這是x*x
結果,臨時int
,而double&
返回類型甚至不兼容),這樣即使你正確的是,你正在返回一個不正確的局部變量的引用,因爲當函數返回時該變量超出了範圍。
類型的x*x
爲int
,所以是有意義的返回int
int squaredX (int x)
{
return x*x;
}
這有可能是的x*x
結果是太大,無法爲int
,在這種情況下,你可能希望使用更大的類型來計算和返回值。但這取決於具體的情況。
可能更好的一種方法是使用模板和通用轉發引用(C++ 11或更新版本)。
template<typename T>
T square(const T&& x)
{
return x*x;
}
牛逼可能是double
,int8_t
,int
,MyComplexMath::Quaternion
...任何支持operator*
。如果參數的拷貝成本很高,它也支持通過引用。
可以說,這可能(正確如此)嚇跑人,所以可能不是「最好的」。它仍然沒有解決溢出問題。
如果您正朝着這個方向努力,那麼您最好提供輸出作爲參考參數,以避免複製返回值,並使用'* =',當與類一起使用時,效率會更高。 –
@NeilKirk - 你的意思是返回一個引用而不是一個值?這通常不被推薦 - 編譯器RVO(返回值優化)應避免返回值的副本。 '* ='是非常量 - 這看起來像是一個交易斷路器。 –
不,我的意思是參考被作爲參數傳遞。 RVO不會改變'x * x'分配臨時對象的事實。如果它是一個類,它可能會分配動態內存。 –
你不會說你正在使用什麼語言,這會幫助你很難。無論如何,'&'看起來像是我的錯字。 –
假設這是C++,則返回對臨時對象的引用。 – user3553031
我認爲這可能屬於[代碼評論](http://codereview.stackexchange.com/)。 – Jamesking56