为什么clang要处理这个简单的std::variant代码中的异常?

7
如果我们有这样的代码:
#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;生成代码 在我的情况下 - Daniel Langr
你说得对。我会编辑这个问题。 - Nick
1
有点奇怪,因为在Clang中noexcept(a.swap(b))是正确的,所以它应该能够“知道”main中实际上没有任何异常可以抛出。 - Daniel Langr
1个回答

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接