12

私が現在読んでいる本(HerbertSchildtのC++ Complete Referencenew )には、を使用して割り当てられた配列に初期化子を含めることはできないと書かれています。

を使用して動的に割り当てられた配列を初期化できませんnewか?そうでない場合、その理由は何ですか?

4

3 に答える 3

19

それは完全には真実ではありません(ほぼ確実に代替参照を取得する必要があります)。配列を()初期化する空の初期化子( )が許可されますが、配列newを使用する場合は配列要素を個別に初期化できません。(ISO / IEC 14882:2003 5.3.4 [expr.new] / 15を参照)

例えば

int* p = new int[5](); // array initialized to all zero
int* q = new int[5];   // array elements all have indeterminate value

より複雑な初期化子を許可しない基本的な理由はありません。それは、C++03にそのための文法構造がなかったということだけです。C ++の次のバージョンでは、このようなことができるようになります。

int* p = new int[5] {0, 1, 2, 3, 4};
于 2011-07-16T12:12:22.837 に答える
0

その本は正しい。あなたが持つことはできません、

int *p = new int[3](100);

その背後にある理解できる理由はありません。そのため、C++0xに配列の初期化子があります。

于 2011-07-16T12:16:48.243 に答える
0

この本は正しいと思います。一般的に、現在のバージョンのc++ではそれを行うことはできません。ただし、boost::assignを使用して動的配列を実現できます。以下を参照してください。

#include <boost/assign/list_of.hpp>
class Object{
public:
    Object(int i):m_data(i){}
private:
    int m_data;
};

int main()
{
    using namespace boost::assign;
    std::vector<Object> myvec = list_of(Object(1))(Object(2))(Object(3));
}
于 2011-07-16T15:23:44.760 に答える