所以..我寫了一些代碼,想知道複合算子的原型(即類似operator*=
或operator/=
)。當我查看它時,我意識到它們應該返回引用。 (至少我的源這樣指出:R& operator +=(K& a, S b);
。)嗯..然後我意識到,在我的代碼行可能會多一分危險比它似乎是:C++ - 如果我返回一個* = b;`會發生什麼?
// I have a really fancy Vector class I've been making. :P
template<typename T, int N>
inline Vector<T, N> operator*(const Vector<T, N>& vec, T scale) {
Vector<T, N> ret = vec;
return ret *= scale;
}
所以..我想知道如果這是無害的......或者會導致引用局部變量泄漏並導致各種未定義的行爲和普遍的破壞。 (我傾向於破壞,並且,正因爲如此,它改寫如下:P)
// I have a really fancy Vector class I've been making. :P
template<typename T, int N>
inline Vector<T, N> operator*(const Vector<T, N>& vec, T scale) {
Vector<T, N> ret = vec;
ret *= scale;
return ret;
}
所以..啊..一般的C++ 「有什麼關係?」問題在這裏。很高興知道肯定。 (而且我懶得去試一下測試用例,看看我的程序是否暫停並着火了:P)
編輯:修正了上面的代碼之後..我意識到它可能有助於把上述化合物運營商也在這裏。 :P
template<typename T, int N>
inline Vector<T, N>& operator*=(Vector<T, N>& vec, T scale) {
for (int i = 0; i < N; i++) {
vec[i] *= scale;
}
return vec;
}
所以..與糾正代碼(雙重檢查),我使用的第一個變體仍然會導致懸掛引用或不知道是否(因爲operator*=
返回類型爲參考) 。
就我所見,這兩個例子都做同樣的事情:它們返回一個對局部變量的引用,該變量立即超出範圍並且不再存在。 –
@JerryJeremiah當然他們不......後者肯定不會返回對局部變量的引用。前者......那是我的問題!編輯:嗯..我再次看着它,我現在看到它..忽略這一點。 :P –
@CorneliaXaos函數的兩個版本的返回類型都是'Vector&',它是一個引用,並且返回'ret',這是一個局部變量。因此,您正在返回對局部變量的引用。 –