Если у нас есть такой код:
#include <variant>
int main(){
using V = std::variant<int, double>;
V a = 5;
V b = 5.6;
a.swap(b);
}
https://gcc.godbolt.org/z/oqGiHs
Если вы компилируете с помощью clang, он генерирует код, который обрабатывает исключение во время swap
.
Почему? Оба варианта не являются пустыми, а базовые типы безопасны для исключений.
Обновление:
По иронии судьбы, это компилируется без исключения:
#include <variant>
template<class T>
void sw(T &a, T &b){
auto c = a;
a = b;
b = c;
}
int main(){
using V = std::variant<int, double>;
V a = 5;
V b = 5.6;
sw(a, b);
}