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