2017-01-21 28 views
3

如果您使用的结构化绑定,像这样结构绑定和强制复制省略

auto [a, b, c] = std::make_tuple(1, 10.0, "string object"s); 

然后将返回的元组的副本被省略和对象直接进入abc或将初始化是举来自单个元组元素的构造?我怀疑这会造成副本的发生,但我不确定标准中的强制副本的描述是否处理这种情况。

+0

“将从返回的元组中删除副本,并且对象直接进入a,b和c”否“,将初始化为单个元组元素的移动构造”No. – cpplearner

+0

@carraarner然后将它们复制? – Curious

回答

4

所涵盖的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完成之前,行为可能会发生变化。

+0

在这个例子中,'a','b','c'是'&&'和'get'是相当于'std :: move(e)'调用的。 –

+0

@ T.C。 'e'是一个左值,所以'得到(e)'应该是接受左值引用并返回左值引用的版本? (但即使你是对的,最终的结果也是一样的,因为a,b,c也是左值)。 [dcl.decomp/3]当前说“否则,初始化程序就是'get (e)'” –

+1

这里的措辞是非常棘手的。关键句是“在任何一种情况下,如果实体”e“的类型是左值引用,则”e“是左值,否则是”左值“。 –