3

如果您像这样使用结构化绑定

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

那么返回的元组中的副本是否会被删除,对象会直接进入ab或者c初始化是否会是来自单个元组元素的移动构造?我怀疑这会导致复制发生,但我不确定标准中对强制复制省略的描述是否能处理这种情况。

4

1 回答 1

4

正如这个出色的答案所涵盖的那样,声明相当于:

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; 它被定义为声明一个使用纯右值表达式初始化name的类型的对象decltype(prvalue)——没有像以前版本那样可以删除的中间临时对象。

换句话说,e声明的行为与以下内容完全相同:

std::tuple<int, double, std::string> e {1, 10.0, "string object"s};

然后a,b,c是对该元组元素的引用。


注:以上解释对应最新的C++17草稿源码;当然,在 C++17 最终确定之前,行为可能会发生变化。

于 2017-01-22T00:29:56.010 回答