Нет массива, выделенного с помощью new, может иметь инициализатор? - PullRequest
11 голосов
/ 16 июля 2011

В книге, которую я сейчас читаю ( Полная справка по C ++ от Герберта Шильдта), говорится, что ни один массив, выделенный с использованием new, не может иметь инициализатор.

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

Ответы [ 3 ]

18 голосов
/ 16 июля 2011

Это не совсем так (вы почти наверняка получите альтернативную ссылку), вам разрешен пустой инициализатор (()), который инициализирует значение массива, но да, вы не можете инициализировать элементы массива индивидуально при использовании массива new. (См. ИСО / МЭК 14882: 2003 5.3.4 [expr.new] / 15)

* 1006 Е.Г. *

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};
0 голосов
/ 16 июля 2011

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

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

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

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

...