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

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

04.07.2018, 22:13. Показов 10727. Ответов 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
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,101
03.11.2018, 04:57
поэтому использование автосгенерированного оператора копирования невозможно и он был удален или не был создан
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13241 / 6873 / 1827
Регистрация: 18.10.2014
Сообщений: 17,420
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
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru