С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/47: Рейтинг темы: голосов - 47, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15

Почему оператор присваивания удаляется?

04.07.2018, 22:13. Показов 10186. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возьмём код
C++
1
2
3
4
5
6
7
8
9
10
11
#include <vector>
 
class C {
    const std::vector<int> v;
};
 
int main()
{
    C c1, c2;
    c1 = c2;
}
Он не компилируется и я не могу понять почему. При этом компиляторы расходятся в объяснении:
gcc http://rextester.com/CAISN32556
Code
1
2
3
4
5
source_file.cpp: In function ‘int main()’:
source_file.cpp:10:8: error: use of deleted function ‘C& C::operator=(const C&)’
     c1 = c2;
        ^
source_file.cpp:3:7: note: ‘C& C::operator=(const C&)’ is implicitly deleted because the default definition would be ill-formed:
clang http://rextester.com/WOFS13160
Code
1
2
3
4
5
6
source_file.cpp:10:8: error: object of type 'C' cannot be assigned because its copy assignment operator is implicitly deleted
    c1 = c2;
       ^
source_file.cpp:4:28: note: copy assignment operator of 'C' is implicitly deleted because field 'v' has no copy assignment operator
    const std::vector<int> v;
                           ^
msvc http://rextester.com/ZKII44420
Code
1
2
source_file.cpp(10): error C2280: 'C &C::operator =(const C &)': attempting to reference a deleted function
source_file.cpp(5): note: compiler has generated 'C::operator =' here
Не нашёл в стандарте указания, что неявный оператор класса C должен быть удалён (gcc/msvc), если его тело would be ill-formed (gcc), да и у вектора вроде есть copy assignment оператор (clang).
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.07.2018, 22:13
Ответы с готовыми решениями:

Переменная удаляется после присваивания
После строки 85 переменная c почему-то удаляется. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string.h&gt; #include...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор *
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Оператор присваивания
Добрый день! Помогите, пожалуйста, разобраться. Я не совсем понимаю работу перегруженного оператора присваивания в классе String, который...

25
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.07.2018, 22:56
Цитата Сообщение от Конгрессмен Посмотреть сообщение
class C {
* * const std::vector<int> v;
};
а если логику включить?

поле - неизменяемое.
состояние объекта такого класса нельзя изменить.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
05.07.2018, 08:39
оператор присваивания у вектора не константный. следовательно, его нельзя использовать из константного объекта. что не понятно?
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15
05.07.2018, 17:32  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
оператор присваивания у вектора не константный. следовательно, его нельзя использовать из константного объекта.
С этим никто не спорит. Посмотрите на сообщения компиляторов. clang вообще говорит, что у вектора нет оператора присваивания. Все компиляторы сообщают, что оператор у класса C удалён, хотя я не нашёл правил, которые говорят, что он должен быть удалён.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
05.07.2018, 20:36
Цитата Сообщение от Конгрессмен Посмотреть сообщение
C удалён, хотя я не нашёл правил, которые говорят, что он должен быть удалён.
Ать
For a class, its non-static data members, its non-virtual direct base classes, and, if the class is not abstract (10.4), its virtual base classes are called its potentially constructed subobjects.
Два
A defaulted copy/move assignment operator for class X is defined as deleted if X has:
— a variant member with a non-trivial corresponding assignment operator and X is a union-like class, or
— a non-static data member of const non-class type (or array thereof), or
— a non-static data member of reference type, or
a potentially constructed subobject of class type M (or array thereof) that cannot be copied/moved because overload resolution (13.3), as applied to M’s corresponding assignment operator, results in an ambiguity or a function that is deleted or inaccessible from the defaulted assignment operator.
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15
05.07.2018, 20:40  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
Два
И что из тех трёх нужных для удаления оператора вещей при overload resolution происходит?
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15
17.07.2018, 09:49  [ТС]
Тема актуальна.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
19.07.2018, 14:38
а) копировать вектор нужно
C++
1
2
3
class C {
    std::vector<int> v;
};
б) копировать вектор не нужно
C++
1
2
3
4
5
6
7
8
9
10
class C {
    const std::vector<int> v;
public:
    C &operator= (C &other) {
        if(&other == this)
            return *this;     
        // здесь копируется что-то ещё, но не v
        return *this;
    }
};
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15
21.08.2018, 04:15  [ТС]
Тема актуальна.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
21.08.2018, 16:01
Конгрессмен, Какого рода ответ вам нужен? Логически объясняющий причины удаления конструктора или вывод строго по пунктам стандарта, с приведением всей цепочки рассуждений, которая привела к этому выводу?
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15
21.08.2018, 16:16  [ТС]
DrOffset, "вывод строго по пунктам стандарта, с приведением всей цепочки рассуждений, которая привела к этому выводу" это и есть "(ответ,) логически объясняющий причины удаления конструктора" (точнее, оператора присваивания).
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
21.08.2018, 18:53
Цитата Сообщение от Конгрессмен Посмотреть сообщение
это и есть
Я так не думаю.
Можно одни и те же вещи объяснить как с рабоче-крестьянской позиции, так и с академической.
Если первый вариант может быть логичным, и устроить с бытовой точки зрения, то второй - ближе к юридически оформленному документу, что, некоторым образом, разные вещи.
Но ответ на свой вопрос я услышал.

И еще один вопрос: вы сами знаете верный ответ? Еще более явно: является ли ваш вопрос попыткой "протестировать" сообщество на компетентность, или у вас и правда присутствует непонимание данного аспекта?
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15
30.10.2018, 18:33  [ТС]
Тема актуальна. Не собирающимся отвечать просьба проходить мимо.
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15
01.11.2018, 22:11  [ТС]
Ну раз мою тему перенесли в другой раздел и она сразу утонула на 50-ю страницу, бампану ещё раз.
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
02.11.2018, 10:05
А чего вы в ней ожидаете? На вопрос вам подробно ответили. Если непонятно что-то еще - так сформулируйте вопрос.
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15
02.11.2018, 23:19  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
На вопрос вам подробно ответили.
Где?!
0
 Аватар для COKPOWEHEU
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
03.11.2018, 00:23
тут, тут, тут, тут. Вам расписали почему ваша конструкция не работает и что сделать чтобы работала. Или был какой-то другой вопрос, который я проглядел?
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15
03.11.2018, 00:26  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Или был какой-то другой вопрос, который я проглядел?
Был вопрос почему он должен (или не должен) удаляться по стандарту.
Ответа на этот вопрос не дали.
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
03.11.2018, 01:36
Конгрессмен, потому что константные переменные нельзя перезаписывать.
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15
03.11.2018, 01:46  [ТС]
New man, И?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.11.2018, 01:46
Помогаю со студенческими работами здесь

Оператор присваивания
Какая разница между оператором &quot;=&quot; и &quot;==&quot; Почему , например , в цикле нужно писать while(count==1) а не ...

оператор присваивания
Подскажите пожалуйста, вот я создал класс, конструктор которого создает 2хмерный массив из 2ойного указателя, являющейся членом этого...

Оператор присваивания
Здравствуйте! Есть класс, в котором перегружены операции сложения и присваивания: void operator = (Matrix&amp;); Matrix operator +...

Оператор присваивания.
Всем привет!В универе щас работаем с классами и перегрузками.В частности перегрузкой оператора присваивания и индексации.И я в упор не...

оператор присваивания
Привет всем ! Каким образом вызывается оператор присваивания, например, здесь: a = &quot;I &quot;; если в аргументе char*, а в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru