【发布时间】:2020-06-16 08:29:37
【问题描述】:
如果我们有这样的代码:
#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);
}
【问题讨论】:
-
GCC 只是为隐式
return 0;in my case 发出代码。 -
你是对的。我将编辑问题。
-
这有点奇怪,因为
noexcept(a.swap(b))对 Clang 来说是真的,所以它应该能够“知道”main中的任何东西实际上都不能抛出。
标签: c++ gcc clang c++17 std-variant