の線に沿って何かを考えるとき
auto x = new T;
標準では、メモリはクラス固有またはグローバルのどちらから取得する必要があるかを強制していますか?operator new
つまり、クラス固有の欠如を考えると、適合実装operator new
がグローバル以外のどこからでもメモリを取得できる方法はありませoperator new
んか?
私はあなたがそれを間違った方法で持っていると思います。
式new T
は常に次の 2 つのステップで構成されます。
適切なものoperator new
が検索されます。クラスT
に存在する場合はそれが取得され、そうでない場合はグローバルなものが取得されます。これは標準で義務付けられているため、グローバルなものは常に存在します(したがって、(すでに定義されているため)「定義」することはできませんが、置き換えることはできます)。
常に無条件::new T
にグローバルを選択すると言うことができます。operator new
割り当て関数が呼び出されて成功すると、そのメモリ内にオブジェクトが構築されます。
と言うと、同じことが起こりますが、ステップ 1で適切なシグネチャnew (a, b, c) T
を持つオーバーロードを探しているだけです。operator new
::operator new
メモリは代わりにクラス固有のものから取得できるため、確実であるとは限りませんがoperator new
、そのようなクラス固有のバージョンが存在しない場合は、グローバル バージョンが使用されます。標準の関連部分は次の[expr.new]/8
とおりです。
new-expression は、割り当て関数を呼び出すことによって、オブジェクトのストレージを取得します。... 割り当て関数の名前は operator new ...
標準は、メモリが演算子 new-class-specific または global から取得する必要があることを強制しますか?
はい、そうです。
§5.3.4 [expr.new]
:
p8 new 式は、割り当て関数(3.7.4.1)を呼び出すことによって、オブジェクトのストレージを取得します。[...] 割り当てられた型が非配列型の場合、割り当て関数の名前は
operator new
[...] です。p9 new-expressionが単項演算子で始まる場合
::
、割り当て関数の名前はグローバル スコープで検索されます。それ以外の場合、割り当てられた型がクラス型T
またはその配列である場合、割り当て関数の名前は のスコープで検索されT
ます。この検索で名前が見つからない場合、または割り当てられた型がクラス型でない場合、割り当て関数の名前がグローバル スコープで検索されます。