Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140

Создаётся объект на стеке, хотя конструкторы удалены

03.07.2024, 13:10. Показов 3243. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот такой пример.
Вроде бы все конструкторы удалены, а объект всё равно создаётся на стеке, если указать инициализатор {}

попробовал на 14 и 17 стандартах - прокатывает (непонятно, почему).
А на 11 и 20+ не работает, как и ожидается

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
struct A
{
    int i=42;
    
    A()=delete;
    
    A(const A&)=delete;
    A(A&&)=delete;
    A& operator=(const A&)=delete;
    A& operator=(A&&)=delete;
    ~A()=default;
};
 
int main()
{
    A r{};//ок!
 
    std::cout<<r.i;
 
    //new A{}; //а тут ошибка, как и ожидается
}
Почему так происходит?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.07.2024, 13:10
Ответы с готовыми решениями:

Если внутри функции создается объект с помощью gcnew, он создается один раз или при каждом вызове?
Обработчик по нажатию кнопки Visual C++ 2010 private: System::Void but1_Click(System::Object^ sender, System::EventArgs^ e) { ...

Интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект
Привет всем. Необходимо реализовать интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект. Не...

Определить, есть ли в стеке хотя бы два отрицательных элемента
1.В структуру данных- стек занести последовательность из случайных N чисел. Определить, есть ли в стеке хотя бы два отрицательных элемента....

18
03.07.2024, 13:17

Не по теме:

Хотя я невнимательно прочел вопрос. Пока удалю.

0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
03.07.2024, 20:08
Нужно изучать подробности, раньше сталкивался...
В С++ 11 не работает именно из-за дефолтной инициализации переменной члена класа.

Добавлено через 5 минут
An aggregate is ... class types that has
Ограничение для с++11
no default member initializers
(since C++11)
(until C++14)
Дозволяется для с++14/17, проходит условия ниже :
no user-provided, inherited, or explicit constructors (since C++11) (until C++20)
no private or protected direct(since C++17) non-static data members
no base classes (until C++17)
no virtual base classes
no private or protected direct base classes (since C++17)
no virtual member functions
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
03.07.2024, 20:37  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
no user-provided, inherited, or explicit constructors
ну как это ноу?
А вот это?
Цитата Сообщение от Алексей1153 Посмотреть сообщение
A()=delete;
Цитата Сообщение от Алексей1153 Посмотреть сообщение
A(const A&)=delete;
Цитата Сообщение от Алексей1153 Посмотреть сообщение
A(A&&)=delete;
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
03.07.2024, 20:59
Цитата Сообщение от Алексей1153 Посмотреть сообщение
А вот это?
Ну видимо это не user-defined.
На cppref я такого не нашел, в стандарте копаться не буду, по этой теме, мне достаточно.

Добавлено через 2 минуты
C++
1
2
    // user-defined constructor
    A(){};
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
03.07.2024, 21:03
Цитата Сообщение от Алексей1153 Посмотреть сообщение
А вот это?
Эти не считаются user-provided.
С с++11 до с++14 default member initializers ограничивают (о чем уже написали).
А начиная с с++20 ограничение на user-declared конструкторы.
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
03.07.2024, 21:03  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
defined
- это когда юзер сделал свой конструктор

Цитата Сообщение от SmallEvil Посмотреть сообщение
no user-provided
а provided - это, я так понимаю, юзер что угодно сделал - определил или удалил
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
03.07.2024, 21:04
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а provided - это, я так понимаю, юзер сто угодно сделал - определил или удалил
Не, https://en.cppreference.com/w/... _functions
1
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
03.07.2024, 21:07
Цитата Сообщение от Алексей1153 Посмотреть сообщение
ну как это ноу?
Так вы конструкторы удалили. Теперя их ноу. Но инициализатор есть, значит и конструктор он слепить должен неявно даже дефаултный.
Заприватьте дата мэмбэр и будет вам щастье.
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
03.07.2024, 21:10  [ТС]
Fulcrum_013, а если полей совсем нет, что будем приватить?

Добавлено через 44 секунды
zayats80888, я так понимаю, в 14 и 17 комиссия чуток накосячила, а в 20 исправила?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
03.07.2024, 21:13

Не по теме:

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
значит и конструктор он слепить должен неявно даже дефаултный
Агрегатная инициализация к конструкторам не имеет отношения.



Добавлено через 2 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
я так понимаю, в 14 и 17 комиссия чуток накосячила, а в 20 исправила?
Х.з., я свечку не держал, и до твоего поста с этим не сталкивался (у тебя очень специфичный класс, который в реальности не встретишь)
1
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
03.07.2024, 21:19  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
который в реальности не встретишь
я внезапно встретил так: понадобилось при выходе из скоупа совершать некоторое действие над глобальными данными (то есть, в конструкторе ничего не нужно, полей никаких не нужно). В деструкторе класса A оно совершается. Я, как законопослушный гражданин, коли уж есть деструктор, доделал правило пяти. Затем стал вспоминать, нужен ли при этом конструктор по умолчанию. Ну, вроде как нужен. А дай-ка я попробую без конструктора по умолчанию. А оно - работает! У меня 17-й стандарт.
Из интересу удалил конструктор - всё равно работает с инициализатором {}

я конструктор то сделал, чтобы потом не стрельнуло Но нужно понять, что это было
0
03.07.2024, 21:22

Не по теме:

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Затем стал вспоминать, нужен ли при этом конструктор по умолчанию.
Ну а я, как законопослушный гражданини, всегда его "дефолтил", если "удалял" другие (во всяких там non-copyable базах, и пр.)

0
03.07.2024, 21:53  [ТС]

Не по теме:

zayats80888, я задефолтил ) В первом посте удаление - это для демонстрации "проблемы"

0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
03.07.2024, 22:07
Алексей1153, кстати ошибка для new-expression это баг. У тебя на gcc она выскакивала?
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
03.07.2024, 22:19  [ТС]
zayats80888, да

Добавлено через 9 минут
короче, "во многой мудрости много печали" Всё ж таки stateless. А мне оттуда только деструктор нужен

C++
1
2
3
4
5
6
struct A
{
    ~A()
    {
    }
};
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
03.07.2024, 22:33
Алексей1153, Если полей нет то сайз все равно 1 байт. Так что можно дамми байт приватить.
Или обджект пустого класса если уж чтоб точно 0 для [no_unique_address]. Вы никак пытаетесь сделать что то в духе отучения кастомных пропертей от захвата их в auto декларациях?
Можно конструктор кстати заприватить. Ну или запротектить если чилдам надо.
0
фрилансер
 Аватар для Алексей1153
6466 / 5688 / 1131
Регистрация: 11.10.2019
Сообщений: 15,140
04.07.2024, 08:32  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Вы никак пытаетесь сделать
в посте №12 то, что я хотел сделать. В №16 - вот так и сделаю

вопрос был не про то, что я пытаюсь сделать, а почему работает то, что, вроде бы, не должно работать
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13183 / 6819 / 1821
Регистрация: 18.10.2014
Сообщений: 17,259
09.07.2024, 23:33
Лучший ответ Сообщение было отмечено Алексей1153 как решение

Решение

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Создаётся объект на стеке, хотя конструкторы удалены
Ну, то есть, подытоживая:

Все зависит от того, является ли ваш класс агрегатом. Если это агрегат, то к нему применима агрегатная инициализация. Агрегатная инициализация - это, как уже тысячу раз тут вдылдонивали, механизм инициализации, который никакого отношения ни к какими конструкторам не имеет и никаких конструкторов не использует. Поэтому, если класс - агрегат, то что за конструкторы вы там "удалили" ни на что не влияет.

В С++11 этот класс не является агрегатом из-за инициализатора = 42. В С++14 и С++17 этот класс является агрегатом. Однако начиная с С++20 такой класс опять перестает быть агрегатом (https://www.open-std.org/jtc1/... 1008r1.pdf) уже из-за удаленного конструктора.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
//new A{}; //а тут ошибка, как и ожидается
Оба варианта должны вести себя одинаково. То есть в С++17 тут ошибки быть не должно, но судя по всему это баг GCC: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94983. В Clang этого бага нет.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.07.2024, 23:33
Помогаю со студенческими работами здесь

Не могу понять где объект в куче или в стеке !
Сразу к примеру: class Zombie; { Soldat soldat; // что солдат внутри зомби делает не спрашивайте String name; int ...

Конструкторы и указатели на объект класса
Добрый вечер. Помогите, пожалуйста, прояснить 2 вещи: 1) В чём будет отличие между конструкторами: int a; //Исп. оператор...

Функция: определить, есть ли в стеке хотя бы один элемент, лежащий в заданном диапазоне
Разработать функцию, которая определяет, есть ли в стеке хотя бы один элемент, лежащий в заданном диапазоне. Код: ...

не создается объект
добрый час. подскажите , почему не могу использовать сеттер при создании объекта ? class User{ protected $login; protected...

Не создается объект
почему не создается мячик? using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru