【问题标题】: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 中的任何东西实际上都不能抛出。

标签: c++ gcc clang c++17 std-variant


【解决方案1】:

原来是clang bug。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多