私の理解のため、5つのルールはガイドラインのルールです。私は、コンパイラが暗黙的に関数を削除することがあることを見てきました。たとえば、move-ctor 'を定義すると、コピー代入/コピーctorが削除されます。5つのルールと暗黙的に削除された関数
私は、上記のシナリオがあるかどうかを知りたいと思います。言い換えれば、ユーザ定義関数が暗黙的に他の関数を削除するシナリオはありますか?
おかげ
EDIT:
細かすぎるだろう主題をカバーし、いくつかのソースを参照します!
私の理解のため、5つのルールはガイドラインのルールです。私は、コンパイラが暗黙的に関数を削除することがあることを見てきました。たとえば、move-ctor 'を定義すると、コピー代入/コピーctorが削除されます。5つのルールと暗黙的に削除された関数
私は、上記のシナリオがあるかどうかを知りたいと思います。言い換えれば、ユーザ定義関数が暗黙的に他の関数を削除するシナリオはありますか?
おかげ
EDIT:
細かすぎるだろう主題をカバーし、いくつかのソースを参照します!
"5"のすべてについて、標準では暗黙的に削除されると宣言される状況を定義します。私は名前を付けてC++標準N4659からあなたのための関連するセクションを引用しています
[..] [注意:既定のメンバが存在しない場合は、 イニシャライザ(12.2)、共用体の非静的データメンバにはデフォルトのコンストラクタ(15.1)、コピー コンストラクタ(15.8)、移動コンストラクタ(15.8)、コピー代入演算子15.8)、移動代入演算子(15.8)、 またはデストラクタ(15.4)の場合、対応するユニオンのメンバ関数はユーザ提供でなければなりません。または、 暗黙的に労働組合のために(11.4.3)削除 - エンドノート]
デフォルトコンストラクタ(15.1) 、コピーコンストラクタとコピー代入演算子(15.8)、移動コンストラクタ と移動代入演算子(15.8)、デストラクタ(15.4)は 特殊メンバ関数 です。 [ のプログラムで が明示的に宣言されていない場合は、という明示的に宣言された場合、実装によって暗黙的に一部のクラスタイプのメンバー関数が宣言されます。実装は、odr-used(6.2)の場合、暗黙的にそれらを定義します。 15.1、 15.4および15.8を参照のこと。 (5.1)Xは、Aは -
:Aがあれば削除されるようクラスXのためのデフォルトコンストラクタが定義されているデフォルト: - エンドノート ]
: - は(5.8)任意の潜在的な構築サブオブジェクトは、デフォルトしたデフォルトコンストラクタ
クラスXのデフォルトのコピー/移動コンストラクタは、Xが次のように定義されている場合、削除済み(11.4.3)として定義されます。
- (10.1)対応するコンストラクタが些細な変形メンバXは共用体クラス
- (10.2)潜在的に構築されたサブオブジェクトタイプM(またはその配列)で、overlo広告解像度(16.3)、Mの対応するコンストラクタを見つけるために適用されるように、曖昧さまたは削除またはデフォルトコンストラクタからアクセスできない機能、
もたらす - (10.3)デストラクタを持つタイプの任意の潜在的構築サブオブジェクトそのまたはデフォルトのコンストラクタからアクセスできない。
- コピーコンストラクタの場合は(10.4)、rvalue参照型の非静的データメンバー。オーバーロード解決(16.3,16.4)によって、削除されたとして定義されたデフォルトの移動コンストラクタは無視されます。 [注意:削除された移動コンストラクタは、代わりにコピーコンストラクタを使用できるrvalueからの初期化を妨害します。 - エンドノート]コピー/移動代入演算子の
:
- (7.1)非自明な対応代入演算子を持つ変異体及びXは、組合のようなクラス、または
である - (7.2)は、非静的データCONST非クラス型の部材(又はその配列)、又は
- (7.3)参照型の非静的データメンバ、または
- (7.4)直接n Mの対応する代入演算子を見つけるために適用されるオーバーロード解決(16.3)があいまい性またはaをもたらすので、コピー/移動することができないクラスタイプM(またはその配列)または直接ベースクラスMの非静的データメンバーデフォルトの代入演算子から削除またはアクセスできない関数です。
場合削除済みとしてクラスXのための不履行デストラクタが定義されている:
- (5.1)Xが有する組合のようなクラスであります
- (5.2)潜在的に構築されたサブオブジェクトがクラスタイプM(またはその配列)を持ち、Mが削除されたデストラクタまたはデフォルトのデストラクタからアクセスできないデストラクタを持っている場合
- ( 5。3)、または仮想デストラクタでは、非配列デリゲーション関数を参照すると、あいまいさが発生するか、デフォルトのデストラクタから削除またはアクセスできない関数が発生します。
ありがとうございました! – Elimination
常に暗黙的ではない、ユーザー宣言ので、もし、宣言されている唯一の3つの特殊なメンバーがあります。コピーコンストラクタ、コピー代入、およびデストラクタが。それぞれの暗黙の宣言は、操作が利用できない場合には、宣言として削除される可能性があります。 –
これらはすべてC++標準の「特別会員機能」(https://timsong-cpp.github.io/cppwp/n4659/special)の下にあります。そのセクションで「削除済み」という単語を探してください。 – StoryTeller
これについては、どこかで奇妙な行列がありましたが(いくつかの会議ではおそらく会話の一部でした)、神の愛のために私は正しいことを知ることができません。 – MikeMB