> Я вообще не очень понимаю, как можно возвращать ссылку на локальную переменную, хоть она и rvalue (в первом случае), это ведь UB, не?
Никак нельзя конечно. Автор собственно об этом и пишет и поэтому принимает решение изменить сигнатуру оператора, чтобы он возвращал rvalue вместо ссылки.
вы поняли, но сделали из этого в корне неверный вывод: возвращать rvalue (новый объект).
Согласно негласным общепринятым правилам, результат подобных модифицирующих операций (=, +=, ++ и т.п.) можно присваивать. Но присваивать не только новому объекту, но и ссылке:
Vector3& a = (b += c);
Чисто из семантики это означает, что мы модифицировали b, и создали ссылку на b, т.е. c и b указывают на один и тот же объект, Это означает, что если я сделаю a.x = 42, то и b.x будет равен тому же. Вы же возвращаете новый объект, и такое присвоение невозможно, а даже если бы и удалось, то в итоге a и b указывали бы на разные объекты с одним и тем же значением.
Такие операторы корректно писать так:
Vector3& operator = (const Vector3 &other)
{
if (this != &other) // если кто-то напишет "a = a;", лучше всего ничего не делаеть
{
x = other.x;
y = other.y;
z = other.z;
}
return *this;
}
Таким образом мы после модификации возвращаем именно себя и позволяем нормально работать с ссылками на объект без выделения дополнительной памяти.
Альтернативный способ с возвратом нового объекта, который очень изредка имеет смысл — это хранить в объекте не сами инты, а ссылки на них (и принимать ссылки в конструкторе). Но тогда надо видоизменять ваш класс.
Знаю, что шансов мало (я их и сам когда-то просил включить HSTS на online.sberbank.ru, о чём получил классический ответ ни о чём), но вы всё-таки попробовали бы написать им в саппорт.
С перехватом паролей всё понятно. Я не очень понял, можно ли таким образом дистанционно узнать и подменить IMSI, на который смотрят банки. Ваше второе исследование, как я понял, делает это путём физического доступа к симке.
Я не очень в курсе, как работает атака из поста, но сбер или тинькофф, например, детектят смену сим-карты. Возможно, конечно, с такой атакой можно номер симки тоже сэмулировать.
Копировать диски и читать мануалы я умею и сам, спасибо. Мне просто неуютно видеть упоминание себя в качестве «админа» и фразу «надо было конечно перед использованием проверить на что они влияют» от одного и того же человека.
Про вектор указателей согласен.
Про «C++-специфичный» — нет, это достаточно стандартный термин для обозначения одномерного массива. Хотя в данном случае конечно он устроен именно как вектор в C++.
С этим я и не подумаю спорить, боже упаси) Но я там выше привёл пример даже очень маленького диффа — замена тела функции из трёх строк на четыре других строки.
Никак нельзя конечно. Автор собственно об этом и пишет и поэтому принимает решение изменить сигнатуру оператора, чтобы он возвращал rvalue вместо ссылки.
> Vector3 operator = (const Vector3 &v)
Вы творите что-то страшное. Ущербность кода
вы поняли, но сделали из этого в корне неверный вывод: возвращать rvalue (новый объект).
Согласно негласным общепринятым правилам, результат подобных модифицирующих операций (=, +=, ++ и т.п.) можно присваивать. Но присваивать не только новому объекту, но и ссылке:
Чисто из семантики это означает, что мы модифицировали b, и создали ссылку на b, т.е. c и b указывают на один и тот же объект, Это означает, что если я сделаю a.x = 42, то и b.x будет равен тому же. Вы же возвращаете новый объект, и такое присвоение невозможно, а даже если бы и удалось, то в итоге a и b указывали бы на разные объекты с одним и тем же значением.
Такие операторы корректно писать так:
Таким образом мы после модификации возвращаем именно себя и позволяем нормально работать с ссылками на объект без выделения дополнительной памяти.
Альтернативный способ с возвратом нового объекта, который очень изредка имеет смысл — это хранить в объекте не сами инты, а ссылки на них (и принимать ссылки в конструкторе). Но тогда надо видоизменять ваш класс.
без боязни утечки или накладных расходов на создание/дестрой умного указателя.
Про «C++-специфичный» — нет, это достаточно стандартный термин для обозначения одномерного массива. Хотя в данном случае конечно он устроен именно как вектор в C++.