Описание тега rule-of-zero

Классы, которые имеют настраиваемые деструкторы, конструкторы копирования / перемещения или операторы присваивания копирования / перемещения, должны иметь дело исключительно с владением. Другие классы не должны иметь настраиваемых деструкторов, конструкторов копирования / перемещения или операторов присваивания копирования / перемещения.
3 ответа

Проблемы с пониманием синтаксиса C++11 в "Правиле нуля"

Я изучаю " Правило нуля" и у меня есть 2 вопроса для последнего фрагмента кода, который демонстрирует это правило. class module { public: explicit module(std::wstring const& name) : handle { ::LoadLibrary(name.c_str()), &::FreeLibrary } {} /…
12 ноя '13 в 21:48
1 ответ

Применимо ли "правило нуля" к классам с виртуальными методами?

Я считаю, что правило "ноль", упомянутое на слайдах Питера Соммерлада (стр.32), очень убедительно. Хотя, похоже, я помню, что существовало строгое правило, согласно которому нужно определять виртуальный деструктор, если у класса есть виртуальные чле…
3 ответа

Правило ноля C++: полиморфное удаление и поведение unique_ptr

В недавнем журнале о перегрузках в разделе " Применение правила нуля" авторы описывают, как мы можем избежать написания правила пяти операторов, поскольку причины их написания: Управление ресурсами Полиморфная делеция И об этом можно позаботиться, и…
08 апр '14 в 03:38
1 ответ

Правило ноль путаницы?

Итак, я читал о правиле нуля. Упрощенная версия: я не понимаю цель этого правила. Правило трех и пяти является своего рода "правилом большого пальца", но я не вижу "практического правила" или каких-либо других конкретных намерений с этим правилом. П…
09 июл '17 в 15:18
1 ответ

Просто добавьте деструктор, который ничего не делает, может вызвать ошибку компиляции (вокруг std::move), почему?

Пока я учился std::moveЯ нашел странную проблему. Если я добавлю только деструктор, который ничего не делает с идеальной программой, я получу ошибку компиляции. #include <iostream> using namespace std; class M { public: int database = 0; M &am…
06 дек '16 в 06:33
1 ответ

Понимание правила нуля

У меня есть базовый класс, и я не хочу делать производный класс копируемым. Чтобы все было ясно, я реализую это следующим образом: class A { public: A() = default; virtual ~A() = default; A(const A&) = delete; A(const A&&) = delete; A&am…
13 сен '15 в 10:07
1 ответ

unique_ptr, пользовательские удаления и Rule of Zero

Я пишу класс, который использует два объекта, созданные с использованием интерфейса C. Объекты выглядят так: typedef struct... foo_t; foo_t* create_foo(int, double, whatever ); void delete_foo(foo_t* ); (аналогично для bar_t). Поскольку C++11, я хоч…
13 мар '15 в 15:09
2 ответа

Правило нуля против деструкторов базового класса

У меня есть базовый класс Base и производный класс D, и я хотел бы, чтобы конструктор перемещения и оператор присваивания перемещения автоматически генерировались компилятором для меня. Следуя правилу нуля, я оставляю все управление памятью компилят…
02 янв '17 в 10:23
1 ответ

Правило нуля в C++ и что такое "объявленный пользователем" конструктор?

После гонок на Легкость в разъяснении Орбиты я сузил свой пост. Прочитав эту статью: Правило нуля, Я понял больше всего, но все еще хочу решить некоторые неясные вопросы, которые у меня есть: 1. Глядя на эту фразу: Если определение класса X явно не …
04 дек '16 в 14:31
0 ответов

Правило 5 - Компилирует без оператора присваивания

Чтобы понять оператор перемещения при работе с элементом, который является массивом, я написал следующий тест разработки. Почему это работает и / или компилируется, когда я нарушил правило 5, не реализовав оператор присваивания или перемещения? Я в …
27 ноя '17 в 23:05
4 ответа

Почему деструктор отключает генерацию неявных методов перемещения?

Читая этот блог, я пытался понять, что говорит правило нуля. IMO, он говорит, что если вы объявите свой собственный деструктор, то не забудьте сделать конструктор перемещения и переместить назначение по умолчанию. Пример: class Widget { public: ~Wid…
26 ноя '15 в 07:29
1 ответ

Как правильно применить правило 5 (или ноль?) К классу, содержащему вектор пользовательских объектов со строками

У меня проблемы с тем, чтобы сосредоточиться на владении и максимизировать производительность с помощью движений. Представьте себе этот гипотетический набор классов, эмулирующий книгу Excel. namespace Excel { class Cell { public: // ctors Cell() = d…
26 апр '19 в 17:55
1 ответ

В чем разница между объявлением конструктора копирования с помощью "= default" или его отсутствием вообще?

Я пытаюсь понять поведение автоматически сгенерированного кода компилятора для различных функций, таких как: деструктор конструктор копирования оператор присваивания переместить конструктор оператор присваивания перемещения Будет ли их объявление с …
1 ответ

Правило нуля - конструктор по умолчанию не создается

Я читал это: https://en.cppreference.com/w/cpp/language/rule_of_three Насколько я понимаю, если вы хотите иметь базовый класс с виртуальным деструктором, вам необходимо определить все 5 специальных функций (извлеченных из раздела правила 0): class b…
19 май '21 в 13:28
0 ответов

Почему конструктор перемещения по умолчанию использует конструктор копирования?

При использовании move constr class A { private: unique_ptr<int> ptr; public: A(const A&) = delete; A& operator= (const A&) = delete; A(A&&) { cout << "MOVE CONSTRUCTOR" << endl; } A& operator = (A&&…
0 ответов

Как правило нуля влияет на разделяемые библиотеки со скрытой видимостью?

ПРИМЕЧАНИЕ: вопрос находится внизу. Я пытаюсь понять проблемы, которые могут возникнуть при использовании правила нуля с разделяемыми библиотеками и производными типами. В демонстрации ниже компилируется с правилом нуля или без него, в зависимости о…
30 июн '21 в 14:49
0 ответов

Реализовать оператор присваивания С++ с точки зрения конструктора

Фон Предположим, вы хотите реализовать класс управления ресурсами на C++. Вы не можете использовать правило нуля или правило пяти значений по умолчанию , поэтому вам действительно нужно реализовать конструктор копирования и перемещения, оператор при…
30 ноя '21 в 21:46
0 ответов

Правила Ноль/Пять/Шесть нарушены?

Операции присваивания должны быть квалифицированы ссылкой - и вопрос здесь не в том, "есть ли смысл присваивать rvalue", а в правильности. По умолчанию операции присваивания возвращают ссылки lvalue. Следовательно, следующий код действителен Class A…