【发布时间】:2016-09-26 13:00:06
【问题描述】:
在Herb Sutter's talk at CppCon16 中,他建议用const std::unique_ptr 编写pimpl idiom(大约10 分钟)。
这应该如何与移动构造函数/赋值一起使用? c ++ 17中有什么东西吗?我找不到任何东西。
【问题讨论】:
-
为什么你不希望你的大多数 pimpl 类是可移动的?这似乎是一件非常合理的事情。
-
@DenisYaroshevskiy 只能假设他有一个特定的用例。一般来说,我同意使用
unique_ptr作为pimpl 的容器。如果您希望它是可复制的,那么您当然必须通过克隆操作来实现它。 -
刚看了视频的相关部分,我不同意他的观点。我认为对于大多数 pimpl 句柄来说,
const unique_ptr很快就会成为一个限制。 -
@RichardHodges - 萨特是对的。如果你复制一个带有 pimpl 的类,如果 pimpl 是 shared_ptr,你或者有两个具有相同 pimpl 的对象,或者如果 pimpl 是 unique_ptr,则一个没有 pimpl 的对象。这打破了一个对象的合同,一个粉刺。另一方面,带有
constpimpl 的对象仍然可以移动。 -
@SamVarshavchik 我看不出
const unique_ptr是如何移动的。没有const unique_ptr&&构造函数。如果您可以提供示例代码,我会很感兴趣。我认为您必须编写一个移动构造函数来移动实现。这仍然使一个对象处于未定义状态。值得注意的是,他没有提供const unique_ptr-as-pimpl (non)-idiom 的用例。 Herb 是个聪明人,但他不一定是我会盲目追随的人。