我想用Pimpl(私有实现)创建一个类。通常,您会这样做:
class A
{
private:
class B;
B* _pimpl = nullptr;
}
,然后在.cpp
文件中定义它。但是我必须使用动态分配。可以使用右值引用代替吗?
class A
{
public:
A(); //Constructor to init rvalue reference
private:
class B;
B&& _pimpl;
}
然后在.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?
我目前正在放假,我只有C ++书籍可供参考。我阅读了有关右值引用的内容,并认为它可能会起作用。你们怎么看?
答案 0 :(得分:5)
如果“工作”是指“编译”,那么可以肯定。
但是_pimpl(B())
将初始化_pimpl作为对临时的引用。成员引用不会延长生存期,因此该构造几乎立即悬而未决。因此,不行。
unique_ptr<B>
是容纳pimpl的更好类型(默认选择)。通常无法避免对动态分配的需求。但是,如果选择一个好的自定义分配器,则可以减轻这些弊端。