5

の線に沿って何かを考えるとき

auto x = new T;

標準では、メモリはクラス固有またはグローバルのどちらから取得する必要があるかを強制していますか?operator newつまり、クラス固有の欠如を考えると、適合実装operator newがグローバル以外のどこからでもメモリを取得できる方法はありませoperator newんか?

4

3 に答える 3

6

私はあなたがそれを間違った方法で持っていると思います。

new Tは常に次の 2 つのステップで構成されます。

  1. 適切なものoperator newが検索されます。クラスTに存在する場合はそれが取得され、そうでない場合はグローバルなものが取得されます。これは標準で義務付けられているため、グローバルなものは常に存在します(したがって、(すでに定義されているため)「定義」することはできませんが、置き換えることはできます)。

    常に無条件::new Tにグローバルを選択すると言うことができます。operator new

  2. 割り当て関数が呼び出されて成功すると、そのメモリ内にオブジェクトが構築されます。

と言うと、同じことが起こりますが、ステップ 1で適切なシグネチャnew (a, b, c) Tを持つオーバーロードを探しているだけです。operator new

于 2012-11-02T16:56:13.487 に答える
4

::operator newメモリは代わりにクラス固有のものから取得できるため、確実であるとは限りませんがoperator new、そのようなクラス固有のバージョンが存在しない場合は、グローバル バージョンが使用されます。標準の関連部分は次の[expr.new]/8とおりです。

new-expression は、割り当て関数を呼び出すことによって、オブジェクトのストレージを取得します。... 割り当て関数の名前は operator new ...

于 2012-11-02T16:50:45.960 に答える
4

標準は、メモリが演算子 new-class-specific または global から取得する必要があることを強制しますか?

はい、そうです。

§5.3.4 [expr.new]:

p8 new 式は、割り当て関数(3.7.4.1)を呼び出すことによって、オブジェクトのストレージを取得します。[...] 割り当てられた型が非配列型の場合、割り当て関数の名前はoperator new[...] です。

p9 new-expressionが単項演算子で始まる場合::、割り当て関数の名前はグローバル スコープで検索されます。それ以外の場合、割り当てられた型がクラス型Tまたはその配列である場合、割り当て関数の名前は のスコープで検索されTます。この検索で​​名前が見つからない場合、または割り当てられた型がクラス型でない場合、割り当て関数の名前がグローバル スコープで検索されます。

于 2012-11-02T16:57:39.383 に答える