ムーブ コンストラクターとムーブ代入演算子が宣言および定義されたツリー クラスがあります。
コンパイラがコピー コンストラクターを合成する必要性を感じてから、std::unique_ptr
プライベート メンバーがあると不平を言うのはなぜでしょうか?
これは逆効果のようです。コンパイラは、本体のない、または単に定義されていない隠しコピーと割り当てが、コピーの試行を防ぐためであることを認識しないでstd::unique_ptr
ください。
また、コピー コンストラクターと代入演算子を空の本体で宣言および定義すると、コンパイラーが満足するのはなぜでしょうか?
このクラスを使用してコードを作成および構築し続ける場合、これは懸念の原因になりますか?
追加:
ソースコードのエラーがないのでソースコードはありません...これは
ソースコードの存在を必要としない質問です。コピー コンストラクターが非公開の場合、コンパイラーが不平を言うので、それらを公開しました。再び非公開にし、コンパイラがヒックアップするかどうかを確認します。
Visual Studio 2012 Professional IDE とそれに関連するコンパイラを使用しています。
移動コンストラクターが存在するときにコンパイラーがコピーコンストラクターを生成するのはなぜですか? 特にコピーコンストラクターが最初に定義されていない場合は、直感に反するようです。
追加の質問:
Visual Studio 2012 は、コンストラクターまたは代入演算子の = delete 宣言をサポートしていないようです。宣言を非表示にすると、コード全体でコンパイラーが泣くようになります。私は今何をしますか?何もしないコピーコンストラクターを宣言するのは悪い考えであることに同意します(以下)。他にどのようなオプションがありますか?
小さな例が本当に必要な場合は、ここにあります。私のコンパイラは = delete をサポートしていません
class Tree{
class TreeNode{
"declaration of unique_ptr, cstrs, move cstrs, hidden copy cstrs"
};
public:
"declaration of unique_ptrs, cstrs, move cstrs, copy cstrs <----- compiler
complains if hidden"
};
これで boost::variant を使用する