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

aka*_*ppa 3 c++ c++11

这个示例代码应该编译吗? 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();
}
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 6

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

显然,没有必要将结果分配std::make_tuple()t.如果您选择引入此变量,则不应std::move(t)在返回时:当return语句中的表达式是局部变量时,无论如何它都被视为rvalue.然而,额外的std::move()抑制复制/移动省略.

  • @akappa:它可能是编译器,也可能是库.您可能想要创建一个完全不使用库的测试用例,但使用带有默认移动构造函数的`struct`,其中包含`std :: unique_ptr <int>`并查看其行为方式. (3认同)