首页 > 解决方案 > 将 std::istream&& 作为参数是否合理?

问题描述

我遇到了执行此操作的代码:

SomeObject parse (std::istream && input) {....

input参数是一个右值引用,这通常意味着该函数旨在获取该参数的所有权。这不是这里发生的事情。

parse函数将完全消耗输入流,并且它需要一个右值引用,因为调用代码将放弃对的所有权,istream因此这是输入流将不可用的信号。

我认为这没问题,因为该parse函数实际上并没有移动对象,所以没有切出子类型的危险。从 's 的角度来看,这基本上表现为正常的引用parse,只有调用函数有一种可编译的注释,您必须放弃流的所有权。

这段代码真的安全吗?还是有一些被忽视的微妙之处使这变得危险?

标签: c++iostreamrvalue-referenceistream

解决方案


Anstd::istream是不可移动的,所以这没有实际的好处。

这已经表明该事物可能已被“修改”,而不会混淆暗示您正在转移std::istream对象的所有权(您没有这样做,也不能这样做)。

我可以看到使用这个说法背后基本原理,说流正在被逻辑移动,但我认为你必须区分“这个东西的所有权正在转移”和“我保留这个东西的所有权,但我将让您使用其所有服务”。所有权转移在 C++ 中被很好地理解为一种约定,但实际上并非如此。当您的代码的用户必须编写时,他们会怎么想parse(std::move(std::cin))

不过,您的方式并不“危险”;您将无法使用该右值引用执行任何您无法使用左值引用的操作。

仅采用左值引用会更加自我记录和传统。


推荐阅读