コンパイラがオブジェクトに対して一意の所有権セマンティクスを強制するようなC++クラスを作成する方法はありますか?コンパイラでC++クラスがオブジェクトの固有の所有権セマンティクスを強制
答えて
はい。コピー/割り当てを無効にして移動を有効にするだけです。
私たちは便利な基底クラス(注意:仮想デストラクタを不要誰が今までこのクラスを介してオブジェクトを所有していないため):まで煮詰めることができstruct unique_thing
{
unique_thing() = default; // you can create me
unique_thing(unique_thing&&) = default; // and move me
unique_thing(unique_thing const&) = delete; // but not copy me
unique_thing& operator=(unique_thing&&) = default; // you may move-assign me
unique_thing& operator=(unique_thing const&) = delete; // but not copy-assign me
};
#include <utility>
#include <type_traits>
#include <cassert>
struct only_moveable
{
protected:
constexpr only_moveable() noexcept = default;
constexpr only_moveable(only_moveable&&) noexcept = default;
constexpr only_moveable& operator=(only_moveable&&) noexcept {};
};
struct MyClass : only_moveable
{
};
int main()
{
// creatable
MyClass a;
// move-constructible
MyClass b = std::move(a);
// move-assignable
a = std::move(b);
// not copy-constructible
assert((not std::is_copy_constructible<MyClass>::value));
// not copy-assignable
assert((not std::is_copy_assignable<MyClass>::value));
}
本のいくつかの一般的なモデルをイディオムは以下のとおりです。
std::unique_ptr<>
std::thread
std::future<>
std::unique_lock<>
boost::asio::ip::tcp::socket
Boost.Asioを参照する前に 'std :: thread'、' std :: unique_lock'、さらに 'std ::'と一般的な 'boost ::'の例を追加したいと思います。 – lisyarus
Btw、あなたはコピーctorを削除し、 '='をコピーする必要はありません。それらは、ユーザが定義した( 'default'ed)move ctorと' = 'を動かすという意味では暗黙的に宣言されていません。 – HolyBlackCat
その勾配は豪華です –
- 1. CentOS:FTPアップロード後にファイルの所有権を強制する
- 2. コンパイラ固有のポインタ?
- 3. C#でIDisposableオブジェクトの共有所有者
- 4. C++:コンパイラ固有のセグメンテーションフォールト配列
- 5. Apache Sparkの所有権とIgniteの所有権
- 6. Objective-C:基本的なメモリ管理。オブジェクトの所有権?
- 7. 転送所有権
- 8. 借用/所有権
- 9. C++でのオブジェクト所有(MVCパターン)
- 10. C++固有は:任意の行列クラス
- 11. 継承 - ターゲット固有の継承クラスC#
- 12. が所有者クラス(JFrameの)
- 13. NSLocalizedString - 国固有の文字列ファイルを強制する
- 14. ファイル所有者がLinuxで所有権を変更できない
- 15. Orbeonフォームデータ固有の制約
- 16. コンパイラ固有のメモリ初期化
- 17. Jenkins SVNチェックアウト所有権
- 18. ReadConsoleInputWラッパーと所有権
- 19. Qtに所有権の有無がありますか
- 20. コンパイラ固有のプロキシに依存するC++ 11のライブラリ機能
- 21. .NETのCOMオブジェクトの「所有権」を解放します
- 22. C++固有ライブラリ:
- 23. C++固有ライブラリ
- 24. dockerの後のファイルの所有権cp
- 25. ターゲット固有のクラスonclick
- 26. クラスに固有の設定
- 27. メソッドのオブジェクト所有権の命名規則
- 28. オブジェクトの所有権 - どのウィジェットがそれを削除すべきですか?
- 29. 所有権のないスタックオブジェクトへのポインタ
- 30. std :: unique_ptrの所有権のないコピー
あなたがしてください手の込んだことはできますか? – Rakete1111
'std :: unique_ptr'に似ていますか? – AndyG
さて、ctorをプライベートにし、友人の 'make_unique'にすることができます。しかし、誰かが自分のクラスを所有していることを制限する正当な理由は本当にありません。それは彼らの責任です。これは根本的に良いデザインに反するものです。 – David