首页 > 解决方案 > 为什么 clang 处理这个琐碎的 std::variant 代码的异常?

问题描述

如果我们有这样的代码:

#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);
}

标签: c++gccclangc++17std-variant

解决方案


事实证明这是clang错误。

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

它似乎已修复,但我找不到已修复的版本。


推荐阅读