雖然「不可複製」將工作中,「不可移動的」基類不會提供你所期望的:
#include <utility>
#include <iostream>
struct nonmovable
{
nonmovable() = default;
nonmovable(const nonmovable&) { std::cout << "copy\n"; }
nonmovable& operator = (const nonmovable&) { std::cout << "asign\n"; return *this; }
nonmovable(nonmovable&&) = delete;
nonmovable& operator = (nonmovable&&) = delete;
};
struct X : nonmovable {};
int main()
{
nonmovable n0;
nonmovable n1(n0);
// error: use of deleted function ‘nonmovable::nonmovable(nonmovable&&)’:
//nonmovable n2(std::move(n0));
X x0;
X x1(x0);
// However, X has a copy constructor not applying a move.
X x2(std::move(x0));
}
此外,移動建築和移動分配必須明確的拷貝構造函數刪除後啓用,如果需要的話:
struct noncopyable
{
noncopyable() = default;
// Deletion of copy constructor and copy assignment makes the class
// non-movable, too.
noncopyable(const noncopyable&) = delete;
noncopyable& operator = (const noncopyable&) = delete;
// Move construction and move assignment must be enabled explicitly, if desiered.
noncopyable(noncopyable&&) = default;
noncopyable& operator = (noncopyable&&) = default;
};
這個名字「noncopyable」和「nonmovable」本身就是很好的描述性名字。然而,「boost :: noncopyable」既是(不可複製的也是不可移動的),這可能是一個更好的(歷史)設計決策。
「那是方便嗎?」不是真的。 – CoffeeandCode
當然,它可能非常有用。但是你也可以使用'boost :: noncopyable'。通常你不需要公有繼承。被刪除的東西可以是「私人」的。 – juanchopanza
你的'nonmovable'和你的'noncopyable'完全一樣。它應該是什麼樣子? – Angew