更多 C++ 惯用法/Const auto 指针
外观
防止持有资源的所有权转移。注意:auto_ptr 已被弃用,并在 C++11 中被 shared_ptr、unique_ptr 和 weak_ptr 取代,因此不再建议使用此惯用法。
通常,需要在代码中强制执行不可转移所有权的设计决策,并借助编译器来强制执行它。此处考虑的所有权是指任何资源的所有权,例如内存、数据库连接等。如果我们不希望获取的资源的所有权在作用域之外或从一个对象转移到另一个对象,则可以使用 const auto_ptr 惯用法。
没有 cv 限定符(const 和 volatile 的正式名称)的 auto_ptr 具有 移动构造函数惯用法 中描述的移动语义。它基本上意味着内存的所有权将无条件地从赋值操作符右侧对象转移到左侧对象,但这确保了资源始终只有一个所有者。const auto_ptr 可以防止这种转移。
将保存内存资源的 auto_ptr 声明为 const。
const auto_ptr <X> xptr (new X());
auto_ptr <X> yptr (xptr); // Not allowed, compilation error.
xptr.release(); // Not allowed, compilation error.
xptr.reset( new X() ); // Not allowed, compilation error.
编译器在这里发出警告,因为 yptr 的复制构造函数并不是真正的复制构造函数,实际上它是一个移动构造函数,它接受对 auto_ptr 的非 const 引用,如 移动构造函数惯用法 中所述。非 const 引用不能与 const 变量绑定,因此编译器会标记错误。
- const auto_ptr 惯法的一个不利后果是,编译器无法为包含 const auto_ptr 成员的类提供默认的复制构造函数。这是因为编译器生成的复制构造函数始终接受 const RHS 作为参数,它不能与 auto_ptr 的非 const 移动构造函数绑定。解决方法是使用 虚拟构造函数 惯用法,或使用 boost::scoped_ptr,它通过禁止访问赋值运算符和复制构造函数来明确禁止复制。