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