C 0x中的“id”函数

前端之家收集整理的这篇文章主要介绍了C 0x中的“id”函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
阅读 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具有可观察到的效果.

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

解决方法

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

猜你在找的C&C++相关文章