阅读
this关于从函数返回右值引用的答案让我思考,如何在C 0x中编写id函数.
基本上,我希望id是一个什么都不做的函数,一个对程序没有可观察影响的函数.
我的第一次尝试如下:
#include <iostream> class X { public: X(std::string&& s) : s(std::move(s)) {}; X(const std::string& s) : s(s) {}; std::string s; ~X() { std::cout << "Destroying: " << s << std::endl; } private: X(const X&) {}; X(X&&) {}; }; template <class T> T&& id(T&& x) { return static_cast<T&&>(x); } int main() { auto&& x1 = X("x1"); std::cout << "Line 1" << std::endl; auto&& x2 = id(X("x2")); std::cout << "Line 2" << std::endl; }
但是,我担心在这种情况下,x2是悬空参考,因为X(“x2”)在“第2行”执行之前被破坏.
所以在这里,很明显id具有可观察到的效果.
解决方法
你不能.通常,您不应该编写返回rvalue引用的函数 – 正如您正确指出的那样,您不能将临时的生命周期延长到足够长的时间.