фрилансер
5834 / 5351 / 1101
Регистрация: 11.10.2019
Сообщений: 14,312
|
||||||
1 | ||||||
VS2019 и noexcept05.12.2023, 17:31. Показов 4352. Ответов 6
Метки нет (Все метки)
имеется вот такой код. Вижуал студия 2019 жужжит на строку 27, я не понимаю, почему
C++17 https://onlinegdb.com/C9LxFbe-e
0
|
05.12.2023, 17:31 | |
Ответы с готовыми решениями:
6
Noexcept и throw() noexcept возвращает значение? Почему нужно noexcept? Noexcept - рекомендации по применению |
фрилансер
5834 / 5351 / 1101
Регистрация: 11.10.2019
Сообщений: 14,312
|
|
07.12.2023, 09:26 [ТС] | 2 |
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
07.12.2023, 11:29 | 3 | |||||
Сообщение было отмечено Алексей1153 как решение
Решение
Алексей1153, потому что у А
operator=(A&&) и\или A(A&&) не noexcept.Добавлено через 9 минут Алексей1153, у std::set перемещающий конструктор не обозначен как noexcept: https://en.cppreference.com/w/... er/set/set (см. номер 8) Поэтому и A(A&&) будет не-noexcept. Добавлено через 3 минуты Вот так можно подавить ассерт, однако правильно ли это будет в принципе - не ясно.
Или возможно это просто дефект стандарта. К сожалению у меня сейчас нет возможности поискать документ об исправлении, если он был вообще. В любом случае MSVC сейчас просто следует правилам (https://eel.is/c++draft/associative#set.overview-2), а в GCC этот конструктор помечен noexcept уже самовольно (поэтому пример работает в онлайн компиляторе).
1
|
фрилансер
5834 / 5351 / 1101
Регистрация: 11.10.2019
Сообщений: 14,312
|
|
07.12.2023, 11:32 [ТС] | 4 |
да, точно. Странно, почему так
И почему тогда 8-я строка нормально воспринимается нет, подавлять не требуется
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
07.12.2023, 12:26 | 5 |
Сообщение было отмечено Алексей1153 как решение
Решение
Потому что std::swap перегружен специально для std::set как noexcept (он использует std::set::swap, который noexcept в большинстве случаев).
Так что видимо в случае из поста наиболее правильным будет перегрузить swap для A.
1
|
фрилансер
5834 / 5351 / 1101
Регистрация: 11.10.2019
Сообщений: 14,312
|
||||||
07.12.2023, 12:52 [ТС] | 6 | |||||
DrOffset, понятно, спасибо
Добавлено через 9 минут как-то так, значит
студия согласная Добавлено через 1 минуту только каждое поле вручную надо не забыть свопнуть
0
|
Вездепух
12768 / 6650 / 1790
Регистрация: 18.10.2014
Сообщений: 16,809
|
||||||
12.12.2023, 18:13 | 7 | |||||
Сообщение было отмечено Алексей1153 как решение
Решение
Причина, по которой специальные методы класса
std::set не являются noexcept периодически всплывают в разных контекстах. Ответ на эту тему можно найти здесьhttps://developercommunity.vis... onstructor Стандарт не требует того, чтобы перемещающие операции std::set были noexcept . Однако в libstdc++ (GCC и Clang) их таки сделали noexcept . В VS они не являются noexcept , потому, что каждый контейнер требует выделения своего индивидуального guard element.Если решать проблему просто грубой навеской noexcept , то это можно сделать так
static_assert перестанет "стрелять".
1
|
12.12.2023, 18:13 | |
12.12.2023, 18:13 | |
Помогаю со студенческими работами здесь
7
Что такое noexcept Ключевое слово noexcept Когда нужно использовать noexcept Оператор noexcept и перегруженные методы класса Требует ли стандарт noexcept деструкторов для классов STL? Дизассемблер в VS2019 ifstream VS2019 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |