アップデート:
上記のリンクと以下の回答は、この機能が標準化されていない理由を説明していません。不思議に思うのはそれだけです。との間のパフォーマンスの問題を考慮してください:std::vector<A> arr(8, 7);
new A[8](7);
使用std::vector<A> arr(8, 7);
する場合は、次のように実装できます (必須ではありません)。
this->internal_buf = new A[8]; // Call default constructor A() 8 times!
for (auto i = 0; i < 8; ++i)
{
this->internal_buf[i] = A(7); // Call constructor A(7) 8 times AGAIN!!!
}
C++ がサポートする場合new A[8](7);
、次のように実装できます。
A* arr = (A*)malloc(sizeof(A) * 8 + extra_size);
for (auto i = 0; i < 8; ++i)
{
new (&arr[i]) A(7); // Call constructor A(7) 8 times ONLY.
}
2 つの方法を比較するnew A[8](7);
と、std::vector<A> arr(8, 7);
その上、私はまた、new A[8](7);
より簡潔で表現力豊かだと感じていますstd::vector<A> arr(8, 7);
とにかく、C++ はプログラマーにこの機能のような別の代替ツールを提供するべきだと思います。C++ の哲学の 1 つは、「できるだけ多くのツールを提供しますが、必要のないものにお金を払う必要はありません」だからです。
以下は元の投稿です。
struct A
{
int n;
A() : n() {}
A(int n) : n(n) {}
};
int main()
{
new A[8]; // OK
new A[8](); // OK
new A[8](7); // Error
}
配列を新規作成するときにコンストラクターを指定できないのはなぜですか?
C++ 標準がこのような便利な機能をサポートしていないのはなぜですか? 根拠は何ですか?