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

问题描述 投票:1回答:1

如果我们有这样的代码:

#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++ clang c++17 variant
1个回答
0
投票

成为noexcept /例外安全并不能保证任何有关编译器行为的信息。这只是同行程序员运行(或不运行)try {}块中代码的信息。这样,就意味着编译器在不注意或忽略优化可能性的情况下可以生成冗余/不需要的代码。

© www.soinside.com 2019 - 2024. All rights reserved.