C++11-元组和移动语义

C++11 - tuple and move semantics

本文关键字:语义 移动 元组 C++11-      更新时间:2023-10-16

这个示例代码应该编译吗?clangg++接受它,而icc 14拒绝这样做,在auto t = ...上抱怨std::unique_ptr的复制构造函数未定义。

#include <iostream>
#include <memory>
#include <tuple>
std::tuple<std::unique_ptr<int[]>, int> foo()
{
    std::unique_ptr<int[]> a;
    unsigned int b;
    auto t = std::make_tuple(std::move(a), b); 
    return std::move(t);
}
int main()
{
    foo();
}

我认为它应该编译:std::make_tuple()的结果是一个临时的std::tuple<T...>,它应该移动构造它的成员。更确切地说,std::tuple<T...>的move构造函数是默认的,这将导致成员式的move构造。

显然,不需要将std::make_tuple()的结果分配给t。如果选择引入此变量,则在返回时不应使用std::move(t):当return语句中的表达式是局部变量时,无论如何都会将其视为右值。然而,额外的std::move()会抑制复制/移动省略。