gpt4 book ai didi

c++ - 自动生成的 move 操作和原始指针成员

转载 作者:行者123 更新时间:2023-11-30 00:51:20 25 4
gpt4 key购买 nike

考虑一个具有以下数据成员的 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 类是某些特定操作系统原始 C 类句柄的一些 RAII 包装器(例如,想想 Win32 HANDLE)。它不可复制,但可 move
相反,m_firstm_last 是映射到文件内容的内存区域中的原始指针。

我希望 MemoryMappedFile 类是可 move 的(但不可复制,就像 Handle 类一样)。

如果不是原始指针,根据 C++11 通过成员 move 自动生成 move 构造函数的规则,该类将自动 可 move 。

不幸的是,原始指针迫使我编写自定义 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++ 标准库有某种形式的“愚蠢的反对聪明但可 move ”指针,零开销,就像原始指针一样(这很好观察 非拥有指针),但定义了 move 操作( move 构造函数和 move 赋值),以便编译器可以在将这些指针作为数据成员的类中自动生成正确的 move 操作。

C++ 标准库或 Boost 中有类似的东西吗?

或者是否有任何其他方法可以实现相同的目标(除了编写我自己的自定义 ObservingPointer 类、包装原始指针和定义 move 操作之外)?

最佳答案

只需将 std::unique_ptr 与您自己的 noop_deleter 一起使用即可。

关于c++ - 自动生成的 move 操作和原始指针成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22307223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com