Передача объекта, возвращаемого функцией, в другую функцию.
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 26.09.19 16:17
Оценка:
Привет всем.

Есть интерфейс t_errors.

У него две реализации — t_errors_without_limits и t_errors_with_limits

Есть два метода, возвращающие экземпляры этих реализацией:
t_errors_without_limits get_errors_without_limits();

t_errors_with_limits get_errors_with_limits();

Теперь есть утилита, работающая с t_errors:
void add_current_errors(t_errors& errs); //errs внутри не запоминается.

Она вызывается приблизительно так:
add_current_errors(ctx.get_errors_without_limits());
//...
add_current_errors(ctx.get_errors_with_limits());

Все компилируется (VC++) и работает как и ожидается.

При включенном 4-ом уровне предупреждений, компилятор предупреждает, что нельзя передавать по ссылке результат метода.

Когда включаешь режим 'совместимости/соответствия' (Conformance Mode=Yes), компилятор отказывается компилировать.

Переделал так:
void add_current_errors(t_errors*);
//...
add_current_errors(&ctx.get_errors_without_limits());
//...
add_current_errors(&ctx.get_errors_with_limits());

Все откомпилировалось и работает без проблем. Предупреждений 4-го уровня тоже нет.

Где-то в глубине души меня беспокоит такая конструкция func1(&func2()). Но она компилируется и работает. То есть, временный объект, возвращаемый из func2, живет до конца вызова func1.

Как сделать лучше — не знаю.

Собственно вопрос — это нормальный подход или могут возникнуть проблем?

Еще раз отмечу, что add_current_errors указатель/ссылку на t_errors внутри не запоминает.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.