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

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

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

最佳答案

正如 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 用于声明一个名为 name 的对象,类型为 decltype(prvalue) 并用纯右值表达式初始化——没有像以前版本中那样可省略的中间临时变量。

换句话说, e 声明的行为与以下内容完全相同:
std::tuple<int, double, std::string> e {1, 10.0, "string object"s};

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

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

关于c++ - 结构化绑定(bind)和强制复制省略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41784796/

10-13 03:35