C++ 0x中的"id"函数

Cli*_*ton 7 c++ rvalue-reference c++11

阅读关于从函数返回右值引用的这个答案让我思考,如何id在C++ 0x中编写函数.

基本上,我想做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;
}
Run Code Online (Sandbox Code Playgroud)

但是,我担心在这种情况下,x2是一个悬空参考,就像X("x2")在"第2行"执行之前被破坏一样.

所以在这里,很明显id有一个可观察到的效果.

如何id在C++ 0x中编写函数,特别适用于没有移动/复制构造函数的类型.

Pup*_*ppy 7

你不能.通常,您不应该编写返回rvalue引用的函数 - 正如您正确指出的那样,您不能将临时的生命周期延长到足够长的时间.