|
Конструктор перемещения замещается шаблонным конструктором
|
|||
---|---|---|---|
#18+
Всех с наступающим! Столкнулся с проблемой. Компилятор VS2019/VS2017 выбирает не тот конструктор при попытке скомпилировать код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
Проблема в том, что в Base классе есть шаблонная функция (так называемый универсальный конструктор), которая, по мнению компилятора, лучше подходит для использования в конструкторе перемещения Derived : Base (std::move(other)), хотя по правилам языка победить должна нешаблонная функция при совпадающих/подходящих аргументах. Так? Данный пример приведен только для иллюстрации проблемы, реальный код несколько сложнее и я не могу написать = default для Derived и Base конструкторов перемещения. И не факт что это поможет. Есть ли способ убедить компилятор использовать конструктор перемещенния Base , а не универсальный конструктор Base из конструктора перемещения Derived ? Я пробовал использовать SFINAE и сделать универсальный конструктор непригодным для использования в качестве конструктора перемещения, но из-за более сложной ситуации в реальном коде, это вызывает проблемы при компиляции других классов, которым нужен данный универсальный конструктор (они перестают его видеть или тупят при попытке выбрать правильную специализацию, короче проблем становится еще больше чем было до этого). https://godbolt.org/z/ER48Ml -------------------------------------------------------------- o(O_O)o ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 15:57 |
|
Конструктор перемещения замещается шаблонным конструктором
|
|||
---|---|---|---|
#18+
Cerebrum, Попробуйте так Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 16:31 |
|
Конструктор перемещения замещается шаблонным конструктором
|
|||
---|---|---|---|
#18+
сработало, спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 16:36 |
|
Конструктор перемещения замещается шаблонным конструктором
|
|||
---|---|---|---|
#18+
Cerebrum, В GCC кстати тоже самое. Я не вникал почему, т.к. нет времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 16:38 |
|
Конструктор перемещения замещается шаблонным конструктором
|
|||
---|---|---|---|
#18+
Быстрый гуглеж показал что универсальные ссылки (template + &&) имеют приоритет при выборе перегрузки. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 16:50 |
|
Конструктор перемещения замещается шаблонным конструктором
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Быстрый гуглеж показал что универсальные ссылки (template + &&) имеют приоритет при выборе перегрузки. ясно, и это странно, как по мне ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 16:54 |
|
Конструктор перемещения замещается шаблонным конструктором
|
|||
---|---|---|---|
#18+
Cerebrum сработало, спасибо че то я поспешил, в тестовом примере заработало, а вот в рабочем коде, увы, нет на наводку я получил, буду искать дальше сам ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 17:06 |
|
|
start [/forum/topic.php?fid=57&msg=39909959&tid=2017493]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 260ms |
total: | 403ms |
0 / 0 |