0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15

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

04.07.2018, 22:13. Показов 10535. Ответов 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
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
03.11.2018, 02:34
Студворк — интернет-сервис помощи студентам
Конгрессмен, ты пытаешься перезаписать константное поле v.
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15
03.11.2018, 03:02  [ТС]
New man,
Цитата Сообщение от Конгрессмен Посмотреть сообщение
Не собирающимся отвечать просьба проходить мимо.
0
03.11.2018, 03:07

Не по теме:

Конгрессмен, вообще, я тебе даже ответил :Р

0
 Аватар для COKPOWEHEU
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
03.11.2018, 04:57
поэтому использование автосгенерированного оператора копирования невозможно и он был удален или не был создан
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13213 / 6846 / 1825
Регистрация: 18.10.2014
Сообщений: 17,327
03.11.2018, 05:35
Лучший ответ Сообщение было отмечено Конгрессмен как решение

Решение

Цитата Сообщение от Конгрессмен Посмотреть сообщение
Был вопрос почему он должен (или не должен) удаляться по стандарту.
Ответа на этот вопрос не дали.
Нынешняя формулировка из стандарта содержит досадный дефект - именно случай константного члена типа "класс" они умудрились "потерять". На эту тему зарегистрирован дефект номер 1499

http://www.open-std.org/jtc1/s... .html#1499

Дефект болтается еще со времени С++11. Почему он до сих пор не исправлен - не ясно. Компиляторы понимают, что намерения отменять поведение С++98, который не разрешает неявной генерации оператора присваивания для таких объектов, не было. Поэтому они удаляют оператор присваивания для таких классов.
0
0 / 0 / 0
Регистрация: 04.07.2018
Сообщений: 15
03.11.2018, 05:45  [ТС]
Я думал я нашёл дефект.

Оказывается всё украдено до меня.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.11.2018, 05:45

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Опции темы

Новые блоги и статьи
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru