如果您像这样使用结构化绑定(bind)
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 用于声明一个名为 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/