Нет массива, выделенного с использованием нового, может иметь инициализатор?

В книге, которую я читаю на данный момент (С++ Complete Reference от Herbert Schildt), говорится, что ни один массив, выделенный с помощью new, не может иметь инициализатор.

Не удается инициализировать динамически выделенный массив с помощью new? Если нет, в чем причина?

Ответ 1

Это не совсем верно (вы почти наверняка получите себе альтернативную ссылку), вам разрешен пустой инициализатор (()), который будет инициализировать массив значением, но да, вы не можете инициализировать элементы массива индивидуально при использовании массив новый. (См. ИСО/МЭК 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

Нет основополагающей причины не допускать более сложный инициализатор, так как С++ 03 не имеет для него грамматической конструкции. В следующей версии С++ вы сможете сделать что-то вроде этого.

int* p = new int[5] {0, 1, 2, 3, 4};

Ответ 2

Книга верна; вы не можете,

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

По этой причине нет понятной причины. Вот почему у нас есть инициализаторы для массива в С++ 0x.

Ответ 3

Я думаю, что книга правильная, в общем, вы не можете сделать это с текущей версией С++. Но вы можете сделать это с 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));
}