If we have code like this:
#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
If you compile with clang, it emits code that handle exception during swap.
Why is that? Both variants are non empty and underlying types are exception safe.
Ironically this compiles without exception:
#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);
}
This turns out to be clang bug.
https://bugs.llvm.org/show_bug.cgi?id=46342
It appears to be fixed, but I can not find the version where is fixed.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With