c++ - 将 std::istream&& 作为参数是否合理?
问题描述
我遇到了执行此操作的代码:
SomeObject parse (std::istream && input) {....
该input
参数是一个右值引用,这通常意味着该函数旨在获取该参数的所有权。这不是这里发生的事情。
该parse
函数将完全消耗输入流,并且它需要一个右值引用,因为调用代码将放弃对的所有权,istream
因此这是输入流将不可用的信号。
我认为这没问题,因为该parse
函数实际上并没有移动对象,所以没有切出子类型的危险。从 's 的角度来看,这基本上表现为正常的引用parse
,只有调用函数有一种可编译的注释,您必须放弃流的所有权。
这段代码真的安全吗?还是有一些被忽视的微妙之处使这变得危险?
解决方案
Anstd::istream
是不可移动的,所以这没有实际的好处。
这已经表明该事物可能已被“修改”,而不会混淆暗示您正在转移std::istream
对象的所有权(您没有这样做,也不能这样做)。
我可以看到使用这个说法背后的基本原理,说流正在被逻辑移动,但我认为你必须区分“这个东西的所有权正在转移”和“我保留这个东西的所有权,但我将让您使用其所有服务”。所有权转移在 C++ 中被很好地理解为一种约定,但实际上并非如此。当您的代码的用户必须编写时,他们会怎么想parse(std::move(std::cin))
?
不过,您的方式并不“危险”;您将无法使用该右值引用执行任何您无法使用左值引用的操作。
仅采用左值引用会更加自我记录和传统。
推荐阅读
- javascript - 最佳实践 - 电子 - 有效地切换平台为每个版本发布电子应用程序?
- java - 如何将外部 java jar 库添加到 Spring Boot 远程调试类路径
- java - Maven 异常:结果太大
- javascript - 如何在按住鼠标按钮的同时获得实时鼠标位置
- python - NameError:名称“pltimg”未在 Google Colab 中定义
- string - 使用 linux 子字符串 bash 从电子邮件中删除域
- python - 使用 Python 在 JSON 对象中搜索查询的最佳方法
- laravel - 如何优化循环,从 Mysql Lumen 获取数据
- c# - 如何使用 xamarin 形式模拟 Firebase 中的内部连接
- reactjs - d3雷达图在React中呈现不一致