如果我们有这样的代码:
#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);
}
成为noexcept
/例外安全并不能保证任何有关编译器行为的信息。这只是同行程序员运行(或不运行)try {}
块中代码的信息。这样,就意味着编译器在不注意或忽略优化可能性的情况下可以生成冗余/不需要的代码。