Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构化绑定和强制副本省略_C++_C++17_Copy Elision_Structured Bindings - Fatal编程技术网

C++ 结构化绑定和强制副本省略

C++ 结构化绑定和强制副本省略,c++,c++17,copy-elision,structured-bindings,C++,C++17,Copy Elision,Structured Bindings,如果您使用这样的结构化绑定 auto [a, b, c] = std::make_tuple(1, 10.0, "string object"s); 然后,返回的元组中的副本将被省略,对象将直接进入a、b和c,还是将初始化从单个元组元素中移除?我怀疑这会导致复制发生,但我不确定标准中对强制复制省略的描述是否处理了这种情况 如所述,该声明相当于: auto e = std::make_tuple(1, 10.0, "string object"s); int& a = get<0&

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

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

然后,返回的元组中的副本将被省略,对象将直接进入
a
b
c
,还是将初始化从单个元组元素中移除?我怀疑这会导致复制发生,但我不确定标准中对强制复制省略的描述是否处理了这种情况

如所述,该声明相当于:

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);
然后
a、b、c
是对该元组元素的引用



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

“返回元组中的副本是否会被省略,对象是否会直接进入a、b和C”否“。初始化是否会从单个元组元素中移动结构“否”。@CPPNearner那么它们是否被复制了?在本例中,
a
b
c
&
s,在
std::move(e)
@T.c.的等价项上调用
get
e
是左值,因此
get(e)
应该是接受左值引用并返回左值引用的版本吗?(但即使你是对的,最终结果也是一样的,因为a、b、c也是左值)。[dcl.decomp/3]当前表示“否则,初始值设定项是
get(e)
”,这里的措辞相当棘手。关键语句是“在任何一种情况下,
e
是一个左值,如果实体的类型
e
是一个左值引用,否则是一个x值。”@T.C.好的,因此[dcl.decomp]/3中的
e
与/1中的
e
不同,后者被指定为通过
auto e=prvalue
(在所有情况下都是左值)对,它不是在/1中引入的变量。本质上这就是核心语言风格的完美转发。
std::tuple<int, double, std::string> e {1, 10.0, "string object"s};