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


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

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

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

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


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


Эту тоже не разрешает.
...
Рейтинг: 0 / 0
31.05.2018, 12:30
    #39653178
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
value-initialization динамического массива
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
31.05.2018, 13:04
    #39653214
a guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
value-initialization динамического массива
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
31.05.2018, 13:08
    #39653220
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
value-initialization динамического массива
Dimitry Sibiryakov,

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

Во-первых должна применяться 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
31.05.2018, 14:18
    #39653293
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
value-initialization динамического массива
Siemarglона работает своеобразно

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

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


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