我正在阅读Scott Meyers的书中关于C ++ 11中线程句柄析构函数的行为。
在这里,作者正在讨论结果是否可以存储在被调用者的未来或承诺中,并解释为什么结果无法存储在调用者的未来:
结果也不能存储在来电者的未来,因为 (除其他原因外)
std::future
可用于创建std::shared_future
(从而转移被叫方结果的所有权 从std::future
到std::shared_future
),然后可以 在原始std::future
被销毁后复制多次。特定 并非所有结果类型都可以复制(即仅移动类型)和 结果必须至少与最后的未来一样长 它,哪个潜在的许多期货对应的 callee应该是包含其结果的那个?因为既没有与被调用者关联的对象也没有对象 与呼叫者相关联的是存储被呼叫者的合适位置 结果,它存储在两者之外的位置。这个位置是 称为共享状态。通常表示共享状态 由基于堆的对象,但它的类型,接口和实现 标准未规定。标准库作者是免费的 以他们喜欢的任何方式实现共享状态。
(来源:Effective Modern C++, p259)
我的问题是
如果我们复制一个未来,我们有完整的副本,那么即使原始的未来对象被删除,我们还有什么困扰呢?
作者的意思是“[鉴定]结果必须至少与最后一次引用它一样长,与被叫者相对应的潜在许多期货中的哪一个应该是包含它的那个导致?“?
答案 0 :(得分:0)
这样想:假设我们确实决定在调用者的将来存储共享状态。现在,我们想利用shared_future
,这意味着我们可以潜在地拥有所述未来的多个副本。假设共享结果对象不可复制,并且只能移动。这意味着结果数据只能存在于共享的期货之一中。如果您有一百个shared_future
对象指向共享结果对象,那么跟踪哪个未来实际包含它将成为一场噩梦。
此外,如果这些包含结果对象的共享期货之一超出范围怎么办?甚至更糟,因为我们会失去结果。