自动生成移动操作和原始指针成员
Automatic generated move operations and raw pointer members
考虑一个MemoryMappedFile
类,其数据成员如下:
class MemoryMappedFile
{
....
private:
// RAII wrapper to some OS-specific raw handle (e.g. Win32 HANDLE),
// representing the memory-mapped file.
Handle m_handle;
// Pointer to file begin (first file byte).
BYTE* m_first;
// Pointer to file end (one byte past last file byte).
BYTE* m_last;
};
Handle
类是一些RAII包装到一些特定的操作系统原始c类句柄(例如Win32 HANDLE
)。它是不可复制的,但它是可移动的。
相反,m_first
和m_last
是与文件内容映射的内存区域内的原始指针。
我想MemoryMappedFile
类是可移动(但不是可复制的,就像Handle
类)。
如果没有原始指针,根据c++ 11的自动通过成员移动生成move构造函数的规则,类将是自动可移动的。
不幸的是,原始指针迫使我编写一个自定义移动构造函数:
MemoryMappedFile::MemoryMappedFile(MemoryMappedFile&& other)
: m_handle( std::move(other.m_handle) )
{
// Move m_first
m_first = other.m_first;
other.m_first = nullptr;
// Move m_last
m_last = other.m_last;
other.m_last = nullptr;
}
如果c++标准库有某种形式的"笨而不聪明但可移动"的指针,开销为零,就像原始指针一样(观察非拥有指针很好),但是定义了移动操作(移动构造函数和移动赋值),这样编译器就可以在将这些指针作为数据成员的类中自动生成正确的移动操作。
在c++标准库或Boost中是否有类似的东西?
或者有任何其他方法来实现相同的目标(除了编写我自己的自定义ObservingPointer类,包装原始指针和定义移动操作)?
使用std::unique_ptr
和你自己的noop_deleter
。
我经常需要一个既可复制又可移动的"智能"指针,但它有一个定义良好的"移动"状态,所以我写了tidy_ptr
,这是一个"哑"智能指针,除了在移动时自己为零外,没有什么特别的作用。该类型是可复制的,因此要获得您想要的类的语义,您仍然需要将复制操作定义为已删除(或仅使用std::unique_ptr
和无操作删除器)。
我试图说服标准委员会,observer_ptr
,"世界上最愚蠢的智能指针",应该有这种行为,但共识是,它应该表现得像一个内置指针(除了在构造函数中的零初始化)。我还是觉得它应该在移动中归零。这篇论文展示了non_owning_ptr
,它是unique_ptr
的别名,带有一个无操作删除器,它可以做你想做的事情。
- 如果基类包含双指针成员,则派生类的构造函数
- C++正确的指针成员初始化
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 为什么 operator() 处的指针成员不起作用?
- 更改队列指针成员的值需要在 C++ 中出现奇怪的错误
- 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?
- 结构对象的指针成员在传递给函数时被修改
- 参数的混合值,当我调用指针成员函数时
- 如何正确使用结构的共享指针成员?
- C++:私有类指针成员返回未定义的值
- 在函数中传递带有指针成员的结构是浅拷贝或深拷贝在 C 中
- 包含指针成员的嵌套结构
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- C++ 类指针成员行为奇怪(错误)
- 常量结构的指针成员
- 在类C++指针成员中
- 指针成员未在复制构造函数中初始化
- C++移动拥有指针成员的构造函数
- C++ 包含唯一指针成员变量的类的赋值运算符
- 如何使用 QPoint 指针成员对类进行排队和取消排队