Я связывал некоторое возвращаемое значение функции со ссылкой на константное значение, но объект был удален до того, как закончился срок действия ссылки на константное значение.
В следующем примере объект Foo уничтожается до окончания срока действия foo
:
#include <iostream>
#include <string>
struct Foo
{
~Foo()
{
std::cout << "Foo destroyed: " << name << std::endl;
}
std::string name;
};
Foo&& pass_through(Foo&& foo)
{
return std::move(foo);
}
int main()
{
const Foo& foo = pass_through({"some string"});
std::cout << "before scope end" << std::endl;
}
Вывод:
Foo уничтожено: некоторая строка
до конца области действия
в прямом эфире на колиру: 1
Я думал, что вы можете связать const T&
с чем угодно. Является ли плохой практикой возвращать T&&
и следует ли возвращать по значению предпочтительнее?
Я наткнулся на это в cpprestsdk здесь:
inline utility::string_t&& to_string_t(std::string &&s) { return std::move(s); }
https://github.com/Microsoft/cpprestsdk/blob/master/Release/include/cpprest/asyncrt_utils.h#L109
Очень запутанно, потому что версия to_string_t
для Windows (отправляется макросами препроцессора) возвращается по значению :
_ASYNCRTIMP utility::string_t __cdecl to_string_t(std::string &&s);
Edit:
Почему это работает при передаче результата pass_through
в функцию, принимающую const Foo&
? В этом случае срок службы увеличивается?