Информация об изменениях

Сообщение Re[5]: Передача объекта, возвращаемого функцией, в другую фу от 01.10.2019 13:32

Изменено 01.10.2019 13:36 rg45

Re[5]: Передача объекта, возвращаемого функцией, в другую функцию.
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>---

КД>Досадно, что сценарий передачи временного объекта по неконстантной ссылке есть, а официального разрешения со стороны C++ нет

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

1. Определяем общую утилитную функцию make_lvalue (имя выбрать по вкусу):
template <typename T>
T& make_lvalue(T&& t)
{
   return t;
}


Замечу, на всякий случай, T&& здесь — это так называемая универсальная ссылка, хоть по внешнему виду и выглядит как rvalue ссылка. Этот параметр абсолютно всеядень и может быть сопоставлен абсолютно любой категории выражений, не только rvalue, но и lvalue. Таким образом, эта функция абсолютно универсальна и отработает во всех случаях как надо. Небезопасность этой функции в том, что можно получать мертвые ссылки, если пользоваться ею бездумно. В то же время эта функция всегда будет безопасной при использовании в качестве подвыражения в составе других выражений.

2. Ну и собсно использование:

add_current_errors(make_lvalue(ctx.get_errors_without_limits()));
//...
add_current_errors(make_lvalue(ctx.get_errors_with_limits()));
Re[5]: Передача объекта, возвращаемого функцией, в другую фу
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>---

КД>Досадно, что сценарий передачи временного объекта по неконстантной ссылке есть, а официального разрешения со стороны C++ нет

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

1. Определяем общую утилитную функцию make_lvalue (имя выбрать по вкусу):
template <typename T>
T& make_lvalue(T&& t)
{
   return t;
}


Замечу, на всякий случай, T&& здесь — это так называемая форвардная ссылка, хоть по внешнему виду и выглядит как rvalue ссылка. Этот параметр абсолютно всеяден и может быть сопоставлен абсолютно любой категории выражений, не только rvalue, но и lvalue. Таким образом, эта функция абсолютно универсальна и отработает во всех случаях как надо. Небезопасность этой функции в том, что можно получать мертвые ссылки, если пользоваться ею бездумно. В то же время эта функция всегда будет безопасной при использовании в качестве подвыражения в составе других выражений.

2. Ну и собсно использование:

add_current_errors(make_lvalue(ctx.get_errors_without_limits()));
//...
add_current_errors(make_lvalue(ctx.get_errors_with_limits()));