如果我们有这样的代码:
#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);
}
return 0;
生成代码 在我的情况下。 - Daniel Langrnoexcept(a.swap(b))
是正确的,所以它应该能够“知道”main
中实际上没有任何异常可以抛出。 - Daniel Langr