是否可以将右值引用用作pimpl句柄?

Noe*_*oel 2 c++ pimpl-idiom reference rvalue-reference c++11

我想用Pimpl(私有实现)创建一个类。通常,您会这样做:

class A
{
private:
  class B;
  B* _pimpl = nullptr;
}
Run Code Online (Sandbox Code Playgroud)

然后在.cpp文件中定义它。但是我必须使用动态分配。可以改用右值引用吗?

class A
{
public:
  A(); //Constructor to init rvalue reference
private:
  class B;
  B&& _pimpl;
}
Run Code Online (Sandbox Code Playgroud)

然后在.cpp文件中:


class A::B
{
public:
   int C = 3u;
}

//and then the constructor of A:

A::A() : _pimpl(B()) { } //now we should have a fresh b pimpl?

Run Code Online (Sandbox Code Playgroud)

我目前正在放假,只有C ++书籍可供参考。我阅读了有关右值引用的内容,并认为它可能有效。你们有什么感想?

Sto*_*ica 5

如果用“工作”来表示“编译”,那么可以肯定。

但是_pimpl(B())将初始化_pimpl作为对临时的引用。成员引用不会延长生存期,因此该构造几乎立即挂起。因此,不行。

A unique_ptr<B>是放置pimpl的更好类型(作为默认选择)。通常无法避免对动态分配的需求。但是,如果选择一个好的自定义分配器,则可以减轻这些缺点。

  • 确实是这样! (2认同)