Является ли это ошибкой G CC, подобной учению cpp .com? - PullRequest
2 голосов
/ 08 марта 2020

На обучающем веб-сайте C ++ (https://www.learncpp.com/cpp-tutorial/6-9a-dynamically-allocating-arrays/) утверждается, что в G CC имеется ошибка, связанная с инициализацией строки в стиле C, когда задействован новый оператор:

На момент написания, в G CC все еще была ошибка, при которой инициализация динамически размещаемого массива символов с использованием строкового литерала в стиле C вызывает ошибку компилятора:

char *array = new char[14] { "Hello, world!" }; // doesn't work in GCC, though it should

Я использую G CC версию 7.4.0.

Если я пытаюсь скомпилировать этот отрывок, я получаю:

error: invalid conversion from ‘const char*’ to ‘char’ [-fpermissive]
     char *array = new char[14] { "Hello, world!" };

Если я пытаюсь скомпилировать код следующим образом:

char *array = new char[14] {'H', 'e', 'l', 'l', 'o', 0}

тогда он работает как положено.

Я предполагаю, что это считается ошибкой, поскольку:

char array[14]{ "Hello, world!" };

работает как положено.

Я не мог найти больше информации об этом. Кто-нибудь может подтвердить или опровергнуть, что это ошибка G CC?

1 Ответ

2 голосов
/ 08 марта 2020

Да, это ошибка G CC. Соответствующая проблема в трекере ошибок: 77841 . Чтобы процитировать описание там:

5.3.4 New [expr.new] стр.17.2
В противном случае новый инициализатор интерпретируется в соответствии с правилами инициализации 8.5 для прямой инициализации .

8.5 Инициализаторы [dcl.init] стр.17.1
Если инициализатором является (не заключенный в скобки) фигурный список инициализации, объект или ссылка инициализируются списком (8.5.4).

8.5.4 Инициализация списка [dcl.init.list] стр.3.2
В противном случае, если T является массивом символов, а список инициализаторов имеет единственный элемент, который является литералом строки соответствующего типа ( 8.5.2), инициализация выполняется так, как описано в этом разделе.

Таким образом, новое выражение в вашем вопросе должно быть правильно сформировано, как и прямая инициализация объекта массива.

Нет прогноза, когда это будет исправлено. Это все еще воспроизводимый в стволе G CC на момент написания этого.

...