Почему clang обрабатывает исключения для этого тривиального кода std :: variant? - PullRequest
7 голосов
/ 16 июня 2020

Если у нас есть такой код:

#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 Ответ

2 голосов
/ 04 июля 2020

Оказывается, это ошибка clang.

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

Кажется, это исправлено, но я не могу найти версию, в которой исправлено.

...