gpt4 book ai didi

c++ - 以 std::istream&& 为参数是否合理?

转载 作者:可可西里 更新时间:2023-11-01 17:24:48 27 4
gpt4 key购买 nike

我遇到过这样做的代码:

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

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

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

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

这段代码真的安全吗?还是有一些被忽视的微妙之处导致了这种危险?

最佳答案

std::move 只是从一个对象产生一个右值引用,仅此而已。右值的性质是这样的,你可以假设在你完成它之后没有其他人会关心它的状态。 std::move 然后用于允许开发人员对具有其他值类别的对象做出 promise 。换句话说,在有意义的上下文中调用 std::move 等同于说“我保证我不再关心这个对象的状态”。

由于您将使对象基本上不可用,并且您希望确保调用者不再使用该对象,因此使用右值引用在某种程度上强制执行了此期望。它强制调用者对您的函数做出 promise 。未能做出 promise 将导致编译器错误(假设没有另一个有效的重载)。您是否真的离开该对象并不重要,重要的是原所有者同意放弃其所有权。

关于c++ - 以 std::istream&& 为参数是否合理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54220831/

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