【发布时间】:2019-06-10 18:17:26
【问题描述】:
我遇到过这样的代码:
SomeObject parse (std::istream && input) {....
input 参数是一个右值引用,这通常意味着函数旨在获取参数的所有权。这不是这里发生的事情。
parse 函数将完全消耗输入流,它需要一个右值引用,因为调用代码将放弃 istream 的所有权,因此这是输入流将不可用的信号。
我认为这没问题,因为parse 函数实际上并没有移动对象,所以没有切出子类型的危险。从parse 的角度来看,这基本上表现为正常的引用,只是对调用函数有一种可编译的注释,您必须放弃对流的所有权。
这段代码真的安全吗?还是有一些被忽视的微妙之处导致了这种危险?
【问题讨论】:
-
毫无疑问,C++ 语言的律师对此会有一些话要说。同时,请您在问题的上下文中定义“好的”、“安全的”、“合理的”和“危险的”这些术语吗?一个人的白兰地是另一个人的毒药。
-
@SamVarshavchik 或强制程序员
std::move正在处理的输入流,这将表明之后没有人应该尝试从中提取。 -
@Caleth 在最初的“WTF”之后,您开始理解“哦,所以它会解析整个输入,因为我放弃了
std::cin的所有权,我不应该使用它后来。明白了。整洁”。至少在我看来。还要考虑std::stringstreams 和std::fstreams 的用法。 -
那么有什么可能使
std::cin无法使用?考虑到流的概念,这方面对我来说特别没有任何意义。流可以位于 EOF。这不会使该流对象不可用。流可能处于不良状态。这不会使对象无法使用…… -
但是,当实现实际上无法“利用”它时,将这种任意限制引入接口有什么意义!?
标签: c++ iostream rvalue-reference istream