まず第一に、あなたが見つけたのは、placement new の宣言ではなく、operatorplacement new の宣言です。これらの演算子はヘッダー ファイル new で宣言されます。
新しい演算子の配置に関して、C++11 標準には次の規則があります。
18.6.1.3.1 これらの関数は予約されており、C++ プログラムは標準 C++ ライブラリ (17.6.4) のバージョンを置き換える関数を定義することはできません。(3.7.4) の規定は適用されません。これらの予約された配置形式は、演算子 new と演算子 delete です。
つまり、これらの新しい演算子配置は当面は役に立ちません。
その後、式 new(&str1) std::string("abc") は、見つかった宣言を呼び出しません (ただし、この式は演算子の配置 new を内部的に呼び出します)。演算子配置 new の呼び出しメソッドは ::operator new(size, pointer); です。
C++ には 2 種類の new があり、1 つは new 式と呼ばれ、もう 1 つは演算子 new と呼ばれます。前者は後者を呼び出してメモリ割り当てを完了し、オブジェクトを構築します。演算子 new はヘッダー ファイル new で定義されます。プログラムにこのヘッダー ファイルが含まれていない場合、コンパイラは演算子 new のセットを自動的に生成します。
言い換えると、placement new 式と new 式は内部でそれぞれ演算子配置 new と演算子 new を呼び出しますが、前者は現時点では「何も処理しません」、後者はストレージ領域に適用される「はずです」。 (通常、クラスは演算子 new をオーバーロードします。これはオーバーロードの後者です)
まず第一に、あなたが見つけたのは、placement new の宣言ではなく、operatorplacement new の宣言です。これらの演算子はヘッダー ファイル new で宣言されます。
新しい演算子の配置に関して、C++11 標準には次の規則があります。
つまり、これらの新しい演算子配置は当面は役に立ちません。
その後、式 new(&str1) std::string("abc") は、見つかった宣言を呼び出しません (ただし、この式は演算子の配置 new を内部的に呼び出します)。演算子配置 new の呼び出しメソッドは
::operator new(size, pointer);
です。C++ には 2 種類の new があり、1 つは new 式と呼ばれ、もう 1 つは演算子 new と呼ばれます。前者は後者を呼び出してメモリ割り当てを完了し、オブジェクトを構築します。演算子 new はヘッダー ファイル new で定義されます。プログラムにこのヘッダー ファイルが含まれていない場合、コンパイラは演算子 new のセットを自動的に生成します。
言い換えると、placement new 式と new 式は内部でそれぞれ演算子配置 new と演算子 new を呼び出しますが、前者は現時点では「何も処理しません」、後者はストレージ領域に適用される「はずです」。 (通常、クラスは演算子 new をオーバーロードします。これはオーバーロードの後者です)