为啥 clang 处理这个琐碎的 std::variant 代码的异常?

Posted

技术标签:

【中文标题】为啥 clang 处理这个琐碎的 std::variant 代码的异常?【英文标题】:Why does clang handle exceptions for this trivial std::variant code?为什么 clang 处理这个琐碎的 std::variant 代码的异常? 【发布时间】: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 中的任何东西实际上都不能抛出。 【参考方案1】:

原来是clang bug。

https://bugs.llvm.org/show_bug.cgi?id=46342

好像已经修复了,但是我找不到修复的版本。

【讨论】:

以上是关于为啥 clang 处理这个琐碎的 std::variant 代码的异常?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 MSVC 使用 SSE2 指令来处理这种琐碎的事情?

为啥 gcc -O3 处理 avx256 的内在比较与 gcc -O0 和 clang 不同?

为啥clang用-O0(对于这个简单的浮点总和)产生效率低下的asm?

为啥 gcc 会产生这个奇怪的程序集 vs clang?

为啥这个结构文字在 VS2013 中通过地址而不是 gcc/clang 时会损坏?

为啥 FxCop 不报告 CA2000 对于这种未处置的类实例的琐碎情况?