如果您使用的结构化绑定,像这样结构绑定和强制复制省略
auto [a, b, c] = std::make_tuple(1, 10.0, "string object"s);
然后将返回的元组的副本被省略和对象直接进入a
,b
和c
或将初始化是举来自单个元组元素的构造?我怀疑这会造成副本的发生,但我不确定标准中的强制副本的描述是否处理这种情况。
如果您使用的结构化绑定,像这样结构绑定和强制复制省略
auto [a, b, c] = std::make_tuple(1, 10.0, "string object"s);
然后将返回的元组的副本被省略和对象直接进入a
,b
和c
或将初始化是举来自单个元组元素的构造?我怀疑这会造成副本的发生,但我不确定标准中的强制副本的描述是否处理这种情况。
所涵盖的this excellent answer,该声明等同于:
auto e = std::make_tuple(1, 10.0, "string object"s);
int& a = get<0>(e);
double& b = get<1>(e);
std::string& c = get<2>(e);
,只是没有一个名字e
。在这种情况下,get
函数产生对所选项目的左值引用。
在C++ 17,auto name = prvalue;
is defined来声明对象称为与prvalue表达初始化decltype(prvalue)
类型的name
- 没有中间临时这是elidable如在以前的版本。
换句话说,所述e
声明行为完全一样:
std::tuple<int, double, std::string> e {1, 10.0, "string object"s};
然后a,b,c
是该元组中的元素的引用。
注:以上解释对应于最新的C++ 17草案来源;在C++ 17完成之前,行为可能会发生变化。
在这个例子中,'a','b','c'是'&&'和'get'是相当于'std :: move(e)'调用的。 –
@ T.C。 'e'是一个左值,所以'得到
这里的措辞是非常棘手的。关键句是“在任何一种情况下,如果实体”e“的类型是左值引用,则”e“是左值,否则是”左值“。 –
“将从返回的元组中删除副本,并且对象直接进入a,b和c”否“,将初始化为单个元组元素的移动构造”No. – cpplearner
@carraarner然后将它们复制? – Curious