5

アップデート:

上記のリンクと以下の回答は、この機能が標準化されていない理由を説明していません。不思議に思うのはそれだけです。との間のパフォーマンスの問題を考慮してください: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++ 標準がこのような便利な機能をサポートしていないのはなぜですか? 根拠は何ですか?

4

5 に答える 5

3

C++ 標準がこのような便利な機能をサポートしていないのはなぜですか? 根拠は何ですか?

(ほぼ)すべてのユースケース(C-APIに渡す場合でも)で組み込み配列を置き換えることができるより良い代替手段があるため:std::vector動的配列(で割り当てられたnew)およびstd::arrayスタック割り当てされたもの。

std::vector使用するstd::vector<A> arr(8, 7)と、8 つの要素のベクトルを作成し、それぞれを 7 で初期化する (WhozCraig がコメントしたように) を使用でき0ますfalse

この機能やその他の便利な機能 (特に自動サイズ変更 / ) に加えて、で配列を作成することpush_back()の最大の利点は、RAIIに準拠していることです。関数の終わりから落ちる」、ステートメント、、、、または例外をスローします。std::vectornewdelete[]returnbreakcontinuegoto

于 2013-09-16T17:04:18.597 に答える
2

間のパフォーマンスの問題を考慮してください。

あなたは実際の実装について間違っています。C++11 では、std::vectorデフォルトで Allocator オブジェクトがありますstd::allocator。最初に を呼び出してメモリを初期化します。これはraw メモリAllocator::allocateを返します。次に、デフォルトでは配置 new を使用して、生メモリ上にオブジェクトを 1 つずつ構築するために呼び出します。言い換えれば、それはあなたが指摘した2番目に可能な実装と基本的に同じです。Allocator::construct

于 2013-09-17T01:59:55.547 に答える
1

C++11より前の場合、これを行うことができます:

new A[8]{ A(7), A(7), A(7), A(7), A(7), A(7), A(7), A(7) };
于 2013-09-16T16:51:46.053 に答える
-1

for_eachとラムダを試しましたか?

A* B = new A[8];

std::for_each(B, B+8, [](A &elem) {
    elem.n = 7;
});
于 2013-09-16T17:13:12.577 に答える