C++ “如何拥有”;工厂功能“;是否返回不可复制的对象? 上下文

C++ “如何拥有”;工厂功能“;是否返回不可复制的对象? 上下文,c++,c++11,move-semantics,copy-elision,noncopyable,C++,C++11,Move Semantics,Copy Elision,Noncopyable,我试图用不同的文件名创建一些gzip归档文件,并编写了以下代码片段 #包括 #包括 #包括 #包括 #包括 boost::iostreams::filtering_ostream&&makeGZipStream(const std::string&archiveName, 常量std::字符串和文件名) { boost::iostreams::过滤gzipstream; boost::iostreams::gzip_参数gzip参数; gzip文件名=文件名; push(boost::iostr

我试图用不同的文件名创建一些gzip归档文件,并编写了以下代码片段

#包括
#包括
#包括
#包括
#包括
boost::iostreams::filtering_ostream&&makeGZipStream(const std::string&archiveName,
常量std::字符串和文件名)
{
boost::iostreams::过滤gzipstream;
boost::iostreams::gzip_参数gzip参数;
gzip文件名=文件名;
push(boost::iostreams::gzip_compressor{thegzip参数});
push(boost::iostreams::file_sink{archiveName});
返回std::move(theGzipStream);
}
int main()
{
boost::iostreams::filtering_ostream&&theGzipStream=makeGZipStream(“archive.gz”,“file”);

gzipstream只需按值返回,并从return语句中删除
std::move()

boost::iostreams::filtering_ostream makeGZipStream(const std::string& archiveName,
                                                     const std::string& fileName)
{
    ...
    return theGzipStream;
}

如果它由于缺少move构造函数而无法编译,那么您运气不好,并且该类型是不可移动的,所以将其包装到
std::unique_ptr
中,并按值返回该指针(这是可以移动的)。

只需按值返回,并从返回语句中删除
std::move()

boost::iostreams::filtering_ostream makeGZipStream(const std::string& archiveName,
                                                     const std::string& fileName)
{
    ...
    return theGzipStream;
}

如果由于缺少move构造函数而无法编译,那么您运气不好,并且该类型是不可移动的,所以请将其包装到
std::unique_ptr
中,并按值返回该指针(该值肯定是可移动的)。

@SergeyA是的,这已经在问题中提到过。@matovich如果您使用
return std::move(theGzipStream)
但它仍然会抱怨,请确保您的类型具有移动构造函数。@matovitch您的问题实际上是不正确的。它适用于
unique\u ptr
s并不是因为省略了复制,而是因为移动constructor@matovitch那么您的类型既不可复制也不可移动。它永远不能通过值返回。最简单的解决方法是p可以在“<代码> > UnQuyGPPT/<代码>中包装它。”MaoViTH,不要紧,它仍然是语义相同的。没有移动构造函数,<代码> UnQuyJPTR/代码>将不能从函数返回(不包括C++ 17复制删除)。@ SergyyA是的,在这个问题中已经提到了。@ MatoViCH如果您使用<代码>返回STD:::GEZIPFIX(GZIPFIX)
但它仍然会抱怨,请确保您的类型具有移动构造函数。@matovitch您的问题实际上是不正确的。它适用于
unique\u ptr
s并不是因为省略了复制,而是因为移动constructor@matovitch那么您的类型既不可复制也不可移动。它永远不能通过值返回。最简单的解决方法是p可以将它封装在<代码> UNQuyJPPT/<代码>中。“MaToViCH”,它没有语义,它仍然是语义相同的。没有移动构造函数,<代码> UnQuyGPPT< /C>不能从函数返回(不包括C++ 17拷贝删除)。