Описание тега 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), очень убедительно. Хотя, похоже, я помню, что существовало строгое правило, согласно которому нужно определять виртуальный деструктор, если у класса есть виртуальные чле…
07 фев '14 в 20:33
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" или его отсутствием вообще?
Я пытаюсь понять поведение автоматически сгенерированного кода компилятора для различных функций, таких как: деструктор конструктор копирования оператор присваивания переместить конструктор оператор присваивания перемещения Будет ли их объявление с …
24 окт '20 в 19:31
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&&…
04 июн '21 в 05:16
0
ответов
Как правило нуля влияет на разделяемые библиотеки со скрытой видимостью?
ПРИМЕЧАНИЕ: вопрос находится внизу. Я пытаюсь понять проблемы, которые могут возникнуть при использовании правила нуля с разделяемыми библиотеками и производными типами. В демонстрации ниже компилируется с правилом нуля или без него, в зависимости о…
30 июн '21 в 14:49
0
ответов
Реализовать оператор присваивания С++ с точки зрения конструктора
Фон Предположим, вы хотите реализовать класс управления ресурсами на C++. Вы не можете использовать правило нуля или правило пяти значений по умолчанию , поэтому вам действительно нужно реализовать конструктор копирования и перемещения, оператор при…
30 ноя '21 в 21:46
0
ответов
Правила Ноль/Пять/Шесть нарушены?
Операции присваивания должны быть квалифицированы ссылкой - и вопрос здесь не в том, "есть ли смысл присваивать rvalue", а в правильности. По умолчанию операции присваивания возвращают ссылки lvalue. Следовательно, следующий код действителен Class A…
31 июл '22 в 07:04