为什么 clang 会处理这个微不足道的 std::variant 代码的异常?
Why does clang handle exceptions for this trivial std::variant code?
如果我们有这样的代码:
#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);
}
原来是 clang bug。
https://bugs.llvm.org/show_bug.cgi?id=46342
好像修复了,但是我找不到修复的版本。
如果我们有这样的代码:
#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);
}
原来是 clang bug。
https://bugs.llvm.org/show_bug.cgi?id=46342
好像修复了,但是我找不到修复的版本。