2017-09-25 11 views
3

私の理解のため、5つのルールはガイドラインのルールです。私は、コンパイラが暗黙的に関数を削除することがあることを見てきました。たとえば、move-ctor 'を定義すると、コピー代入/コピーctorが削除されます。5つのルールと暗黙的に削除された関数

私は、上記のシナリオがあるかどうかを知りたいと思います。言い換えれば、ユーザ定義関数が暗黙的に他の関数を削除するシナリオはありますか?

おかげ

EDIT:
細かすぎるだろう主題をカバーし、いくつかのソースを参照します!

+0

常に暗黙的ではない、ユーザー宣言ので、もし、宣言されている唯一の3つの特殊なメンバーがあります。コピーコンストラクタ、コピー代入、およびデストラクタが。それぞれの暗黙の宣言は、操作が利用できない場合には、宣言として削除される可能性があります。 –

+0

これらはすべてC++標準の「特別会員機能」(https://timsong-cpp.github.io/cppwp/n4659/special)の下にあります。そのセクションで「削除済み」という単語を探してください。 – StoryTeller

+1

これについては、どこかで奇妙な行列がありましたが(いくつかの会議ではおそらく会話の一部でした)、神の愛のために私は正しいことを知ることができません。 – MikeMB

答えて

1

"5"のすべてについて、標準では暗黙的に削除されると宣言される状況を定義します。私は名前を付けてC++標準N4659からあなたのための関連するセクションを引用しています

  • (12.3.3)組合を定義するときは、5の一部が暗黙的に削除することができます。

    [..] [注意:既定のメンバが存在しない場合は、 イニシャライザ(12.2)、共用体の非静的データメンバにはデフォルトのコンストラクタ(15.1)、コピー コンストラクタ(15.8)、移動コンストラクタ(15.8)、コピー代入演算子15.8)、移動代入演算子(15.8)、 またはデストラクタ(15.4)の場合、対応するユニオンのメンバ関数はユーザ提供でなければなりません。または、 暗黙的に労働組合のために(11.4.3)削除 - エンドノート]

  • (15.1)、 "5" は、暗黙的にはユーザー定義された選択肢が存在しない場合に宣言されています:

    デフォルトコンストラクタ(15.1) 、コピーコンストラクタとコピー代入演算子(15.8)、移動コンストラクタ と移動代入演算子(15.8)、デストラクタ(15.4)は 特殊メンバ関数 です。 [ のプログラムで が明示的に宣言されていない場合は、という明示的に宣言された場合、実装によって暗黙的に一部のクラスタイプのメンバー関数が宣言されます。実装は、odr-used(6.2)の場合、暗黙的にそれらを定義します。 15.1、 15.4および15.8を参照のこと。 (5.1)Xは、Aは -
    :Aがあれば削除されるようクラスXのためのデフォルトコンストラクタが定義されているデフォルト

    : - エンドノート ]

  • コンストラクタの(15.1.1)暗黙削除
    - (5.2)Xは、非単純なデフォルトを持つバリアントメンバMを持つ非ユニオンクラスです。このメンバは、メンバではありません。 Mを含む匿名共用体のバリアントメンバーは、デフォルトのメンバー初期化子
    - (5.3)デフォルトのメンバ初期化子(12.2)を持たない非静的データメンバは参照型、
    - (5)です。4)任意の初期化子を持たないconst修飾型(またはその配列)のバリアントでない非静的データメンバーには、ユーザー提供のデフォルトコンストラクタがありません。
    - (5.5)Xは共用体です
    - (5.6)Xは非共用体クラスであり、任意の匿名共用体メンバのすべてのメンバはconst修飾型(またはその配列)であり、そのすべてのメンバはconst修飾型(またはその配列) 、
    - (5.7)ブレースまたはイコールイニシャライザを持つ非静的データメンバを除く、潜在的に構築されたサブオブジェクトは、クラスタイプM(またはその配列)を持ち、Mにはデフォルトのコンストラクタまたはオーバーロード解決がありません( Mの対応するコンストラクタの結果が曖昧になるか、既定のデフォルトコンストラクタから削除またはアクセスできない関数が見つかった場合は、
    : - は(5.8)任意の潜在的な構築サブオブジェクトは、デフォルトしたデフォルトコンストラクタ

  • (15.8.1.10)コピー/移動コンストラクタの暗黙の削除から削除またはアクセス不能にされたデストラクタを持つタイプがあります

    クラス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からの初期化を妨害します。 - エンドノート]コピー/移動代入演算子の

  • (15.8.2)暗黙の削除: Xが有している場合、削除としてクラスXのためのデフォールトコピー/移動代入演算子が定義さ


    - (7.1)非自明な対応代入演算子を持つ変異体及びXは、組合のようなクラス、または
    である - (7.2)は、非静的データCONST非クラス型の部材(又はその配列)、又は
    - (7.3)参照型の非静的データメンバ、または
    - (7.4)直接n Mの対応する代入演算子を見つけるために適用されるオーバーロード解決(16.3)があいまい性またはaをもたらすので、コピー/移動することができないクラスタイプM(またはその配列)または直接ベースクラスMの非静的データメンバーデフォルトの代入演算子から削除またはアクセスできない関数です。

  • (15.4.5)デストラクタの暗黙の削除:

    場合削除済みとしてクラスXのための不履行デストラクタが定義されている:
    - (5.1)Xが有する組合のようなクラスであります
    - (5.2)潜在的に構築されたサブオブジェクトがクラスタイプM(またはその配列)を持ち、Mが削除されたデストラクタまたはデフォルトのデストラクタからアクセスできないデストラクタを持っている場合
    - ( 5。3)、または仮想デストラクタでは、非配列デリゲーション関数を参照すると、あいまいさが発生するか、デフォルトのデストラクタから削除またはアクセスできない関数が発生します。

+0

ありがとうございました! – Elimination

関連する問題