代码之家  ›  专栏  ›  技术社区  ›  Nick

为什么这个std::variant代码包含异常处理?

  •  1
  • Nick  · 技术社区  · 5 年前

    如果我们有这样的代码:

    #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);
    }
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   Nick    5 年前

    结果发现这是一个clang-bug。

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

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