Я столкнулся с следующим странным поведением, и я не могу понять, что происходит.Перегруженный оператор с пустым телом магически работает
У меня есть векторный класс, называемый mvec
, который хранит фактические значения в массиве и класс mvec_transf
, который является преобразованием другого вектора. Он хранит ссылку на другой вектор и унарную функцию, которая определяет преобразование. Вот как это можно использовать:
mvec<int, 3> vec1 {1, 2, 3};
mvec_transf<mvec<int, 3>, std::negate<int>> vec2 {vec1, std::negate<int>()};
// `vec2` contains [-1 -2 -3]
Я перегружен operator-
таким образом, что я мог бы написать auto vec2 = -vec1;
, и это моя текущая реализация:
template <class Vec_t>
mvec_transf<Vec_t, std::negate<typename Vec_t::elem_t>>
operator- (Vec_t& v)
{ /*std::out << "Hello from operator- " << std::endl;*/ }
Таинственно, эта реализация (без тела) работает. Если я прокомментирую определение, я получаю нет совпадения для оператора- ошибки компилятора. Если я этого не сделаю, код компилируется с предупреждениями отсутствует тип возврата и неиспользованная переменная 'v'. Когда я запускаю auto vec2 = -vec1
, vec2
фактически содержит рабочий объект mvec_transf<..>
, который имеет правильную ссылку на vec1
.
Добавив инструкцию печати, я могу подтвердить, что на самом деле вызывается перегруженный оператор. Однако с оператором печати vec2
содержит ссылку на мусор вместо ссылки на vec1
.
Что здесь происходит?
не забывайте [носовые демоны] (https://en.wikipedia.org/wiki/Undefined_behavior) – sp2danny