2015-09-04 3 views
0

Я столкнулся с следующим странным поведением, и я не могу понять, что происходит.Перегруженный оператор с пустым телом магически работает

У меня есть векторный класс, называемый 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.

Что здесь происходит?

ответ

4

У вас есть только неопределенное поведение. От [stmt.return]:

Оттекание конца функции эквивалентно возврату без значения; это приводит к неопределенному поведению в возвращающей значение функции.

Один тип неопределенного поведения - волшебный рабочий код. Другой тип - магически разрушающий-ваш-жесткий диск. Я бы не полагался на это волшебным образом, работая очень долго. Почини это!

+0

не забывайте [носовые демоны] (https://en.wikipedia.org/wiki/Undefined_behavior) – sp2danny

Смежные вопросы