C++ 具有引用元组的结构化绑定引用

C++ 具有引用元组的结构化绑定引用,c++,c++17,structured-bindings,C++,C++17,Structured Bindings,这个问题有点难理解。基本上,我想澄清这些情况 int x=1; 双y=2.0; auto[a,b]=std::forward_as_tuplex,y//a、 b都是参考资料,为什么? auto&&[c,d]=std::forward_as_tuplex,y//这个和上面有什么区别? auto&[e,f]=std::tuple{x,y}//为什么e,f不是右值引用?Resharper将它们显示为值类型而不是引用类型 如果存在引用的某个函数返回元组,如何使用结构化绑定进行复制 std::元组f; 自

这个问题有点难理解。基本上,我想澄清这些情况

int x=1; 双y=2.0; auto[a,b]=std::forward_as_tuplex,y//a、 b都是参考资料,为什么? auto&&[c,d]=std::forward_as_tuplex,y//这个和上面有什么区别? auto&[e,f]=std::tuple{x,y}//为什么e,f不是右值引用?Resharper将它们显示为值类型而不是引用类型 如果存在引用的某个函数返回元组,如何使用结构化绑定进行复制

std::元组f; 自动[x,y]=f//但是我想要一份参考资料的副本,怎么办? std::forward作为tuplex,y给你一个tuple。绑定到tuple的类型是int和double&这与绑定到tuple的类型是int和double的方式相同。基本上:

auto[a,b]=std::forward_as_tuplex,y; auto&&[c,d]=std::forward_as_tuplex,y; 表现得好像:

auto _ue=std::forward_uas_tuplex,y; 使用_ue=删除参考u t; 元组元素\u t&&a=std::getstd::move\u e; 元组元素\u t&&b=std::getstd::move\u e; auto&&&uuuuf=std::forward\u as\u tuplex,y; 使用uu F=删除参考u t; 元组元素\u t&&c=std::getstd::move\u f; 元组元素\u t&&d=std::getstd::move\u f; a是int&的右值引用,c是double&的右值引用,分别是int&和double&的右值引用。这个特殊的公式我特别称它为引用的引用,而不是仅仅称它为int&是必要的,因为decltypename(其中name是一个结构化绑定)提供了被引用的类型,这就是为什么decltypea会提供int&

上面还显示了[a,b]和[c,d]案例之间的区别:auto vs auto&&声明适用于我们正在解构的未命名对象。它不会影响绑定本身†

本案:

auto&[e,f]=std::tuple{x,y}; 不提供引用,因为它解压缩到:

auto&&_g=std::tuple{x,y}; 使用uuu G=删除参考u t; 元组元素\u t&&e=std::getstd::move\u g; 元组元素\u t&&f=std::getstd::move\u g; 所以e是int的右值引用,这意味着decltypee是int,而不是int&

如果存在引用的某个函数返回元组,如何使用结构化绑定进行复制

无法使用结构化绑定创建副本。结构化绑定仅仅是关于对对象进行解构,而不是更改任何内容。如果要制作副本,必须手动执行以下操作:

std::tuple f=/*…*/; std::tuple实际拷贝=f; 自动&[x,y]=实际拷贝; †在上述情况下,由于被解构的底层对象是一个左值引用自动&,这在技术上使绑定本身左值引用到任何对象,而不是右值引用到任何对象-尽管我不确定这是否真的是一个有意义的区别

如果存在引用的某个函数返回元组,如何使用结构化绑定进行复制

也许下面这样的辅助函数会很有用:

template <class Tuple, size_t... indices>
constexpr auto
tuple_copy_impl(const Tuple& tuple, std::index_sequence<indices...>) {
   return std::tuple{std::get<indices>(tuple)...};
}

template <class Tuple>
constexpr auto
tuple_copy(const Tuple& tuple) {
    constexpr auto s = std::tuple_size_v<Tuple>;
    using I = std::make_index_sequence<s>;
    return tuple_copy_impl<Tuple>(tuple, I{});
}

auto [x, y] = tuple_copy(f());

为什么auto&[e,f]=std::tuple{x,y};解包到自动&&uuu g=std::转发作为tuplex,y?为什么元组元素的计算结果是int而不是int&&@szppeter第一个是一个拼写错误。tuple_element_t是int。e的实际类型是int&&,但这不是decltype给您的-它给您引用的类型,而int&&的引用类型是int。tuple_element_t&&不会在std::tuple{x,y}中编译case@szppeter是的,那只是缺少一个删除参考。