【发布时间】:2018-09-18 14:20:00
【问题描述】:
我知道我能做到
auto&& bla = something();
根据something 的返回值的constness,我会得到bla 的不同类型。
这是否也适用于结构化绑定情况,例如
auto&& [bla, blabla] = something();
我猜是这样(结构化绑定搭载在 auto 初始化程序上,其行为如下),但我找不到明确的肯定。
更新:初步测试似乎符合我的预期(正确推导constness):
#include <tuple>
using thing = std::tuple<char, int*, short&, const double, const float&>;
int main()
{
char c = 0;
int i = 1;
short s = 2;
double d = 3.;
float f = 4.f;
thing t{c, &i, s, d, f};
auto&& [cc, ii, ss, dd, ff] = t;
c = 10;
*ii = 11;
ss = 12;
dd = 13.;
ff = 14.f;
}
Live demo,如果auto&& 正在完成它的工作,就会出现我所期望的错误:
main.cpp: In function 'int main()':
main.cpp:20:10: error: assignment of read-only reference 'dd'
dd = 13.;
^~~
main.cpp:21:10: error: assignment of read-only reference 'ff'
ff = 14.f;
我仍然想确切地知道这种行为是在哪里指定的。
注意:使用“转发引用”来表示这种行为可能会延长它,但我没有一个好名字来给auto&& 的const 扣除部分(或模板-T&&) )。
【问题讨论】:
-
因为需要考虑三种情况(基于
something的返回类型,您碰巧省略了)。像这个问题所要求的那样,详细说明所有这些问题,会使这变得有点宽泛。 -
如果它有名字,它就不是一个右值引用 AFAIR。
-
@RichardHodges 从未说过任何关于右值引用的事情。我更关心 const 与非 const 左值参考案例。
-
“通用引用”(现在称为“转发引用”)仅出现在模板中。这些是右值引用。完全不同的东西。令人困惑的是,它们在不同的上下文中都用 && 表示。
-
你试过了吗? - 回答你的问题,当然,为什么不呢?
标签: c++ language-lawyer c++17 forwarding-reference structured-bindings