Итак, я писал код и хотел узнать прототип сложного оператора (например, operator*=
или operator/=
). Когда я посмотрел на него, я понял, что они должны возвращать ссылки. (Или, по крайней мере, мой источник указал, как, например: R& operator +=(K& a, S b);
.) Ну .. Я тогда понял, что линия в моем коде может быть немного более опасным, чем он оказался:C++ - Что произойдет, если я верну a * = 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)
EDIT: После закрепления выше код .. Я понял, что это может помочь поставить указанное соединение оператора здесь. : 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 Конечно, они не ... последнее, конечно, НЕ возвращает ссылку на локальную переменную. Первый ... ну это был мой вопрос! EDIT: Хорошо .. Я посмотрел на него снова, и я вижу это сейчас. Игнорируйте это. : P –
@CorneliaXaos Возвращаемым типом обеих версий функции является вектор Vector & ', который является ссылкой, и вы возвращаете' ret', которая является локальной переменной. Поэтому вы возвращаете ссылку на локальную переменную. –