我曾将一个函数的返回值绑定到一个常量左值引用上,但是该对象在常量左值引用的生命周期结束之前被删除了。
在以下示例中,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 destroyed: some string
在作用域结束之前
在coliru上运行: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);
编辑:
为什么将 pass_through
的结果传递给一个接受 const Foo&
的函数时可以正常工作?这种情况下寿命被延长了吗?