如果我写下这样的话会有什么问题:
Try<std::unique_ptr<int> > some_function() {
std::unique_ptr<int> s(new int(2));
return s;
}
是否调用了复制构造函数?我应该使用std :: move吗?
答案 0 :(得分:4)
std::unique_ptr
doesn't have a copy constructor。你在那里做的与使用unique_ptr的assigning相同:指针被移动。 (虽然在某些情况下你必须明确地move()
指针,否则你会得到一个编译错误;但如果编译器没有抱怨错误,那么它正在悄悄地移动指针)
答案 1 :(得分:3)
在return语句中,可以执行重载解析,就好像return语句中的id-expression指定了一个rvalue:
当满足复制/移动操作的省略标准时,[..],或者当返回语句中的表达式为(可能)时 括号)id-expression命名一个具有在体内声明的自动存储持续时间的对象 [..],重载分辨率 首先执行选择复制的构造函数,就好像该对象是由右值指定的。
因此,您的案例确实符合NRVO,因为s
在函数体中声明,因此不需要std::move()
,因为重载解析可以将s
视为右值。
请注意,如果您的编译器在返回表达式的类型不适合的情况下不支持将std::move()
作为右值处理的第一阶段的重载决策,则可能仍需要s
具有与函数返回类型相同的cv-nonqualified类型。这似乎是clang的主干版本而不是gcc的情况。有关this thread的更多信息。