gpt4 book ai didi

c++ - 返回一个 fstream

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:04 24 4
gpt4 key购买 nike

我有这个功能:

fstream open_user_file() const
{
...
}

但我的编译器提示 fstream 复制构造函数被隐式删除。既然编译器执行了 RVO,为什么选择复制构造函数而不是 move 构造函数?

否则,最好的方法是什么?

最佳答案

目前接受的答案是错误的。

当返回一个具有自动存储的局部变量时,与函数声明的返回类型具有相同的类型,则有两个阶段的过程:

fstream open_user_file() const
{
fstream f;

/*...*/

return f;
}
  1. 首先为拷贝选择构造函数,就好像对象是由右值指定的一样。

  2. 如果第一次重载决议失败或未执行,或者如果所选构造函数的第一个参数的类型不是对象类型的右值引用(可能是 cv 限定的),则再次执行重载决议,将对象视为左值。

这意味着如果 f 是 move 可构造的,那么返回 f 将是首选(并且可能被省略)。否则,如果 f 是可复制构造的,则将完成(并可能省略)返回 f。否则 f 不能从此函数返回,并且会导致编译时错误。

唯一的情况是:

return std::move(f);

应该在实现有问题时提供帮助。在一致的实现中,fstream 是可 move 构造的,并且:

return f;

将是最佳的。如果 f 不可 move 构造,则:

return std::move(f);

对符合规范的实现没有帮助。而且,如果以符合规范的实现方式进行编码,将会产生悲观化的效果,因为它将抑制 RVO。

gcc 4.8 还没有实现可 move 的流(而且流是不可复制的)。这就是你问题的根源。在 C++98、C++03 和 gcc 4.8 中,流不能从函数返回。在 C++11 中它们是。

关于c++ - 返回一个 fstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23176583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com