Привет всем.
Есть интерфейс 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 внутри не запоминает.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --