是否可以使用右值引用作为 pimpl 句柄?
Is it possible to use an rvalue reference as pimpl handle?
我想用 Pimpl(私有实现)创建一个 class。通常你会这样做:
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++ 书供参考。我阅读了右值引用并认为它可能有效。大家怎么看?
如果 "work" 是指 "compile",那么当然可以。
但是 _pimpl(B())
将初始化 _pimpl 作为对 临时 的引用。成员引用 不会 延长生命周期,所以这个构造几乎立即挂起。所以不行,不行。
A unique_ptr<B>
是更适合容纳粉刺的类型(作为默认选择)。通常无法避免动态分配的需要。但是如果选择一个好的自定义分配器,缺点可能会减轻。
我想用 Pimpl(私有实现)创建一个 class。通常你会这样做:
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++ 书供参考。我阅读了右值引用并认为它可能有效。大家怎么看?
如果 "work" 是指 "compile",那么当然可以。
但是 _pimpl(B())
将初始化 _pimpl 作为对 临时 的引用。成员引用 不会 延长生命周期,所以这个构造几乎立即挂起。所以不行,不行。
A unique_ptr<B>
是更适合容纳粉刺的类型(作为默认选择)。通常无法避免动态分配的需要。但是如果选择一个好的自定义分配器,缺点可能会减轻。