Dynami c массив составного типа - PullRequest
1 голос
/ 08 января 2020

Можно ли сделать то же самое без псевдонима типа?

    void f()
    {
        typedef char Str[16];
        int n=256;
        Str** p = new Str*[n];
        delete[] p;
    }

Я попробовал следующее, но не сработало:

    // char(**p)[16] = new char(*[n])[16]; // error
    // char(**p)[16] = new (char(*[n])[16]); // error

1 Ответ

6 голосов
/ 08 января 2020

Похоже, вы хотите создать динамический массив c, в котором тип элемента равен char (*)[16]. Нет, это не может быть сделано без псевдонима типа. Чтобы использовать динамический экстент c, необходимо использовать следующую форму new-expression (C ++ 17 [expr.new] / 1):

:: (опция) new новое размещение (опция) новый идентификатор типа новый инициализатор (опция)

Но если вы посмотрите на определения новый-тип-идентификатор , новый-декларатор и noptr-новый-декларатор , вы увидите что круглые скобки не допускаются для изменения приоритета оператора. Таким образом, мы не можем явно записать желаемый тип в этом контексте.

Лучшее решение: используйте std::vector. Если вы не можете этого сделать (возможно, вы нацелены на очень ограниченную автономную реализацию), используйте typedef.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...