其他分享
首页 > 其他分享> > C 11:显式复制值以用作右值引用的最短路径

C 11:显式复制值以用作右值引用的最短路径

作者:互联网

我有一个功能

class A { <has copy and move constructors > };

void f(A &&a) { ... }

我想用变量x调用函数f,但我想在x的副本上运行f,而不是x本身.为什么我不能这样做?

f(copy(x));

但相反必须这样做

f(A(x));

有什么类似于我上面描述的复制功能吗?

注意:请不要告诉我添加一个进行复制的重载f,我想要的东西不需要重载并且是明确的(即复制使读者清楚地知道复制在这里完成)

解决方法:

template<class T>
std::remove_cv_t<T> copy(T& t) {
  return t;
}
template<class T>
void copy(T&&)=delete; // block rvalue copy
template<class T, size_t N>
void copy(T(&)[N]) = delete; // we can implement this if we want: see below

将复制任何左值.在rvalues和不可复制的类型(如数组)上,它将无法匹配或编译.

template<class T>
std::decay_t<T> copy_even_if_rvalue(T&& t) {
  return std::forward<T>(t);
}
namespace details {
  template<class T, size_t N, size_t...Is>
  std::array<T, N> copy_even_if_rvalue(T(&arr)[N], std::index_sequence<Is...>)
  {
    return {{arr[Is]...}};
  }
}
template<class T, size_t N>
std::array<T, N> copy_even_if_rvalue(T(&arr)[N]) {
  return details::copy_even_if_rvalue(arr, std::make_index_sequence<N>{} );
}
template<class T, size_t N>
std::array<T, N> copy_even_if_rvalue(T(&&arr)[N]) {
  return copy_even_if_rvalue(arr); // forward to lvalue version
}

将复制rvalues和左值.在我看来,通常copy比copy_even_if_rvalue更聪明.

copy_even_if_rvalue会将原始C数组转换为std :: arrays,因为这是复制它们的唯一合理方法.一个=删除重载将是另一个合理的选择.

标签:generic-programming,c,c11,move-semantics,copy-constructor
来源: https://codeday.me/bug/20190725/1528462.html