英語版
このページの英語版を見る
dmd.clone
構造体メンバ関数をビルドする。
opEquals 、opAssign 、ポストブリット、コピーコンストラクタ、デストラクタを含む。
Authors:
License:
ソース clone.d
- pure StorageClass
mergeFuncAttrs
(StorageClasss1
, const FuncDeclarationf
); - 関数属性pure、nothrow、@safe、@nogc、@disableをマージする。 をs1にマージする。Parameters:
StorageClass s1
マージするストレージクラス FuncDeclaration f
関数" にマージする。 Returns:マージされたストレージ・クラス - FuncDeclaration
hasIdentityOpAssign
(AggregateDeclarationad
, Scope*sc
); - 与えられた集約が実際にidentity opAssignを持っているかどうかをチェックする。Parameters:
AggregateDeclaration ad
構造体またはクラス Scope* sc
現在のスコープ Returns:見つかれば opAssign の FuncDeclaration を返し、見つからなければ null を返す。 - FuncDeclaration
buildOpAssign
(StructDeclarationsd
, Scope*sc
); - struct に対して opAssign をビルドする。生成されたopAssign 関数は以下のシグネチャを持つ:
ref S opAssign(S s) // Sは`struct`の名前である
opAssign関数は、以下の制約が満たされていれば、S 構造体に対して構築される。 以下の制約が満たされる場合、opAssign関数は構造体に対して構築される:- S アイデンティティopAssign が定義されていない。
- S 以下のメンバのうち少なくとも1つを持つ。
- れたポストブリットを持つフィールドに対して生成さ
- S は変更可能なフィールドを持たない。
S __swap = void; __swap = this; // ビットコピー this = s; // ビットコピー __swap.dtor();
そうでなければ、S がポストブリットを定義している場合、opAssign のコードは次のようになる:this = s;
生成されるopAssign のパラメータは値で渡されることに注釈: これは、上記の両方のポストブリットが(定義されていれば)呼び出されることを意味する。 生成された。 opAssign の本体に入る前に(それが定義されていれば)呼び出されることを意味する。 上記の生成された関数本体の代入はblit式なので、memcpysとみなすことができる。 (opAssign は無限再帰になるので呼び出されない。 は、パラメータが値で渡されたときにすでに呼び出されているので、呼び出されない)。 S がポストブリットもデストラクタも持たないが、 関数を定義するフィールドを少なくとも1つ含む場合(これは、 関数を定義するフィールドを少なくとも1つ含む。 opAssign を定義するフィールドが少なくとも1つ含まれている場合(これは"@disable"ではない)、ボディはメンバ単位の代入を行う。 代入を行う:this.field1 = s.field1; this.field2 = s.field2; ...;
この状況では、assignemntsは実際のassign式である(opAssign が定義されていればそれを使用する)。 が定義されている場合)。Parameters:StructDeclaration sd
のopAssignを生成するための構造体である。 Scope* sc
コンテキスト Returns:生成されたopAssign 関数。 - bool
needOpEquals
(StructDeclarationsd
); - 構造体のopEqualsが必要である。 フィールドがopEqualsを持つ場合、構造体のopEqualsが必要である。 ユーザーが指定したものが存在しない場合は、それを生成する。
- FuncDeclaration
buildOpEquals
(StructDeclarationsd
, Scope*sc
); - 構造体の opEquals を構築する。 const bool opEquals(const S s) { ...}https://issues.dlang.org/show_bug.cgi?id=3789を修正する。 opEqualsは暗黙的に生成されないように変更された。 これで、構造体比較 s1 == s2 は次のように変換される: s1.tupleof==s2.tupleofに変換される。 に変換されるようになった。EqualExp.op_overloadを参照のこと。
- FuncDeclaration
buildXopEquals
(StructDeclarationsd
, Scope*sc
); - TypeInfo_Struct用に__xopEqualsをビルドする。 bool __xopEquals(ref const S p) const { return this == p; }これはTypeInfo.equals(p1, p2)によって呼び出される。構造体がconstオブジェクト比較をサポートしていない場合、実行時に をサポートしていない場合、実行時に "not implemented"エラーがスローされる。
- FuncDeclaration
buildXopCmp
(StructDeclarationsd
, Scope*sc
); - TypeInfo_Struct用に__xopCmpをビルドする。 int __xopCmp(ref const S p) const { return this.opCmp(p); }これは、TypeInfo.compare(p1, p2)によって呼び出される。構造体がconstオブジェクト比較をサポートしていない場合、実行時に をサポートしていない場合、実行時に "not implemented"エラーがスローされる。
- FuncDeclaration
buildXtoHash
(StructDeclarationsd
, Scope*sc
); - 非ビット単位のハッシュのために_xtoHashを構築する static hash_t xtoHash(ref const S p) nothrow "@trusted";
- void
buildDtors
(AggregateDeclarationad
, Scope*sc
); - 構造体/クラスのデストラクタを集約して、集約デストラクタを作成する。 userDtors[]内のすべてのデストラクタをすべてのメンバのデストラクタに集約することで、構造体/クラスの集約デストラクタを作成する。 すべてのメンバのデストラクタを集約する。 adのfieldDtor、aggrDtor、dtor、tidtorフィールドを設定する。Parameters:
AggregateDeclaration ad
のデストラクタを構築する構造体またはクラス。 Scope* sc
のデストラクタを構築する。 注釈 StructDeclaration::buildPostBlit() とよく似ている、 とよく似ており、順序が変わる(前方ではなく後方に実行される)。
- FuncDeclaration
buildInv
(AggregateDeclarationad
, Scope*sc
); - 構造体/クラスのすべての不変量をinvsに集約して、包含的な不変量を作成する。 invs[]内のすべての不変量を集約することで、構造体/クラスの包括的な不変量を作成する。
void __invariant() const [pure nothrow @trusted] { invs[0](), invs[1](), ...; }
- FuncDeclaration
buildPostBlit
(StructDeclarationsd
, Scope*sc
); - を集約して、構造体の包括的ポストブリットを作成する。 を集約して、構造体の包括的ポストブリットを作成する。 に集約する。 AggregateDeclaration::buildDtor()とよく似ていることに注釈する、 とよく似ており、順序が変わる(後方ではなく前方に実行される)ことに注意。
- bool
needCopyCtor
(StructDeclarationsd
, out boolhasCpCtor
); - struct sd にコピーコンストラクタが必要かどうかを判断する、 以下の条件を満たす場合:
- sdがコピーコンストラクタを定義していない。
- sdの少なくとも1つのフィールドがコピーコンストラクタを定義している。
Parameters:StructDeclaration sd
コピーコンストラクタが生成されるstruct 。 bool hasCpCtor
コピーコンストラクタがすでに存在する場合はtrueに設定される Returns:true 生成する必要がある場合 そうでなければfalse - bool
buildCopyCtor
(StructDeclarationsd
, Scope*sc
); - needCopyCtor() が true を返した場合にコピーコンストラクタを生成する。 生成されるコピーコンストラクタは以下のような形式になる: this(refリターンスコープ inout(S) rhs) inout { this.field1 = rhs.field1; this.field2 = rhs.field2; ... }Parameters:
StructDeclaration sd
コピーコンストラクタが生成されるstruct Scope* sc
コピーコンストラクタが生成されるスコープ Returns:true struct sdがコピーコンストラクタを(明示的にまたは生成して)定義している場合、 そうでない場合はfalse
Copyright © 1999-2024 by the D Language Foundation
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku