powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / value-initialization динамического массива
10 сообщений из 10, страница 1 из 1
value-initialization динамического массива
    #39652874
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
A* a = new A[10](5);


GCC 5.4 можно заставить сожрать такой синтаксис ключом -fpermissive, при этом у всех
десяти объектов реально вызовутся конструкторы и всё будет работать как ожидаемо.

Это расширение чисто у GCC или в какой-то редакции стандарта сабж уже разрешили-таки?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
value-initialization динамического массива
    #39652916
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, это нестандартное.

Согласно стандарту, после new A[10] может идти только инициализатор массива.
Т.е. A[10]{<10 значений>}, если у A нет конструктора по умолчанию, или A[10]{<не более 10 значений>} если есть конструктор по умолчанию.
...
Рейтинг: 0 / 0
value-initialization динамического массива
    #39652919
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНет, это нестандартное.

Жаль, удобная штука. Тем более, что такую конструкцию стандарт разрешает:
Код: sql
1.
A a[10](5);


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
value-initialization динамического массива
    #39652929
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЖаль, удобная штука. Тем более, что такую конструкцию стандарт разрешает:
Код: sql
1.
A a[10](5);


Эту тоже не разрешает.
...
Рейтинг: 0 / 0
value-initialization динамического массива
    #39653178
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЭту тоже не разрешает.

Однако, разрешает:
cppreference3) if T is an array type, each element of the array is
value-initialized;
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
value-initialization динамического массива
    #39653214
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovAnatoly MoskovskyЭту тоже не разрешает.

Однако, разрешает:
cppreference3) if T is an array type, each element of the array is
value-initialized;

A a[10](5); это не value initialization, а direct initialization.
http://eel.is/c draft/dcl.init#17 The semantics of initializers are as follows.
The destination type is the type of the object or reference being initialized and the source type is the type of the initializer expression.
If the initializer is not a single (possibly parenthesized) expression, the source type is not defined.

— If the initializer is a (non-parenthesized) braced-init-list or is = braced-init-list, the object or reference is list-initialized.
— If the destination type is a reference type, see [dcl.init.ref].
— If the destination type is an array of characters, an array of char16_­t, an array of char32_­t, or an array of wchar_­t, and the initializer is a string literal, see [dcl.init.string].
— If the initializer is (), the object is value-initialized.
— Otherwise, if the destination type is an array, the program is ill-formed.Anatoly Moskovsky, конечно, будет говорить, что "Otherwise" относится только к предыдущему пункту ("If the initializer is (), the object is value-initialized."), но не надо его слушать.
"Otherwise" относится ко всем вышеперечисленным. Инициализатор в `A a[10](5)` не попадает ни под одно условие выше пункта с Otherwise, а destination type is an array. Следовательно, the program is ill-formed.
...
Рейтинг: 0 / 0
value-initialization динамического массива
    #39653220
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

начиная с GCC 7 тоже перестает компилировать
...
Рейтинг: 0 / 0
value-initialization динамического массива
    #39653285
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако тут есть такая фича, что просто опа...

Во-первых должна применяться aggregate initialization (пункт следующий 11.6.1 драфта), но она работает своеобразно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <iostream>
using namespace std;

struct A {
    int m_a, m_b;
    //A(int x, int y) {m_a = x; m_b = y;}  // обязательно отсутсвие конструктора
};

int main()
{
    A var_a[10] = {{5,1}}; 
    int z[3] = {-1};
    cout << z[0] << z[2] << endl;
    cout << var_a[0].m_a << var_a[0].m_b << endl;
    cout << var_a[9].m_a << var_a[9].m_b << endl;
}


Вывод -10
51
00
...
Рейтинг: 0 / 0
value-initialization динамического массива
    #39653293
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglона работает своеобразно

В чём своеобразность? В отличии от value, она тем, кому значений в инициализирующем
агрегате не хватило, делает zero. Это ясно написано.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
value-initialization динамического массива
    #39653357
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Пока что до сих пор никто не упомянул про std::vector<int> v(10, 5);
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / value-initialization динамического массива
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]