|
Динамическое включение/отключение конструкторов/операторов присваивания в классе
|
|||
---|---|---|---|
#18+
Всем привет! Пишу шаблонный класс, в котором хочу определять его семантику копирования/перемещения в зависимости от типа шаблонного аргумента. Если шаблонный тип поддерживает семантику копирования и не поддерживает семантику перемещения, то и класс реализующий его логику должен вести себя аналогичным образом. Это очень упрощенное описание реальной задачи, но его достаточно для обозначения проблемы. В целом у меня все получается и работает как задумано, кроме одного момента (убрал все шаблонное, чтобы не усложнять). Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Проблема вот в чем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
пощупать пример вживую Если я буду использовать класс copy_only напрямую, без derived_from_copy, то поведение будет корректным с ожидаемой ошибкой. Я знаю почему это происходит (с точки зрения move-семантики copy-only объекта), но мне бы хотелось реализовать это поведение, по аналогии с тем как работает тип copy_only или как derived_from_move. Что посоветуете? -------------------------------------------------------------- o(O_O)o ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2021, 12:51 |
|
Динамическое включение/отключение конструкторов/операторов присваивания в классе
|
|||
---|---|---|---|
#18+
Cerebrum Код: plaintext 1. 2.
То что тут ошибка вообще похоже на баг, потому что по логике если объект копируемый то его можно скопировать из какой угодно ссылки в т.ч. и rvalue. Более того, https://en.cppreference.com/w/cpp/language/overload_resolution Defaulted move constructor and move assignment that are defined as deleted are never included in the list of candidate functions. Inherited copy and move constructors are not included in the list of candidate functions when constructing a derived class object. Из этих двух абзацев следует что как для derived_from_copy так и copy_only, move ctor исключается из списка кандидатов при поиске перегрузки, а значит он не может предовратить вызов copy ctor . Кстати вот этот код работает без ошибки, а там тоже создается копия из rvalue ссылки :) Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2021, 18:29 |
|
Динамическое включение/отключение конструкторов/операторов присваивания в классе
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky То что тут ошибка вообще похоже на баг проверял на двух компиляторах: clang и msvc - везде одинаково :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2021, 20:28 |
|
Динамическое включение/отключение конструкторов/операторов присваивания в классе
|
|||
---|---|---|---|
#18+
судя по всему, это поведение by design и его никак не обойти ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2021, 20:29 |
|
Динамическое включение/отключение конструкторов/операторов присваивания в классе
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Cerebrum Код: plaintext 1. 2.
То что тут ошибка вообще похоже на баг, потому что по логике если объект копируемый то его можно скопировать из какой угодно ссылки в т.ч. и rvalue. Anatoly Moskovsky Более того, https://en.cppreference.com/w/cpp/language/overload_resolution Defaulted move constructor and move assignment that are defined as deleted are never included in the list of candidate functions. Inherited copy and move constructors are not included in the list of candidate functions when constructing a derived class object. Из этих двух абзацев следует что как для derived_from_copy так и copy_only, move ctor исключается из списка кандидатов при поиске перегрузкиmove-constructor у copy_only не defaulted. Так что первое предложение к copy_only не применимо. Оно применимо только к derived_from_copy. А зачем сюда приплетено inherited copy/move constructors — это вообще непонятно. Вот что такое inherited constructors: Код: plaintext 1. 2. 3. 4.
Anatoly Moskovsky Кстати вот этот код работает без ошибки, а там тоже создается копия из rvalue ссылки :) Код: plaintext 1. 2.
И до C++17 ошибка есть . ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2021, 00:12 |
|
Динамическое включение/отключение конструкторов/операторов присваивания в классе
|
|||
---|---|---|---|
#18+
авторDefaulted move constructor and move assignment that are defined as deleted are never included in the list of candidate functions. a guest move-constructor у copy_only не defaulted. Так что первое предложение к copy_only не применимо. Оно применимо только к derived_from_copy. Тогда напишите что такое "Defaulted move constructor defined as deleted". ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2021, 13:00 |
|
Динамическое включение/отключение конструкторов/операторов присваивания в классе
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky что такое "Defaulted move constructor defined as deleted". C++20 [dcl.fct.def.default]/5Explicitly-defaulted functions and implicitly-declared functions are collectively called defaulted functionsExplicitly-defaulted это C++20 [dcl.fct.def.default]/1A function definition whose function-body is of the form Код: plaintext 1.
is called an explicitly-defaulted definition. Это Код: plaintext 1.
explicitly-defaulted или implicitly-declared, чтобы быть defaulted? Про то, когда defaulted defined as deleted можно почитать в [class.copy.ctor]. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2021, 21:16 |
|
|
start [/forum/topic.php?fid=57&msg=40057501&tid=2017240]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
165ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 242ms |
total: | 505ms |
0 / 0 |