这个示例代码应该编译吗?
clang并g++接受它,同时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)
我认为它应该编译:结果std::make_tuple()是一个临时的std::tuple<T...>,它应该移动构建其成员.更准确地说,std::tuple<T...>移动构造函数是默认的,这应该导致成员移动构造.
显然,没有必要将结果分配std::make_tuple()给t.如果您选择引入此变量,则不应std::move(t)在返回时:当return语句中的表达式是局部变量时,无论如何它都被视为rvalue.然而,额外的std::move()抑制复制/移动省略.