为啥 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 代码的异常?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 gcc -O3 处理 avx256 的内在比较与 gcc -O0 和 clang 不同?
为啥clang用-O0(对于这个简单的浮点总和)产生效率低下的asm?