условные функции constexpr - PullRequest
       39

условные функции constexpr

2 голосов
/ 25 февраля 2020

У меня есть случай, когда функция потенциально может быть constexpr. Обычно добавляется constexpr и используется постоянная оценка, только если это позволяет контекст. Однако следующий код жалуется, несмотря на то, что он не используется в контексте constexpr:

template <typename T>
struct Wrapper
{
    friend constexpr bool operator==(const Wrapper& crLhs, const Wrapper& crRhs) noexcept
    {
        return crLhs.m_t == crRhs.m_t;
    }

    T m_t = {};
};

При использовании Visual Studio 2017 15.9.20 это выдает «ошибку C3615: функция constexpr« operator == »не может привести к постоянному выражению» когда, например, создан для std :: string. Информация верна, но я не создаю ее экземпляр в контексте constexpr.

void f()
{
   bool b;

   Wrapper<int>  a;

   b = a == a; //ok

   Wrapper<std::string> c;

   b = c == c;  //C3615, but not using constexpr context
}

Я могу применить обходной путь, используя шаблон члена, или отбросить constexpr, но есть хитрость здесь, чтобы получить лучшее из обоих миров (например, constexpr, когда это применимо)?

1 Ответ

3 голосов
/ 25 февраля 2020

Ваш код в порядке. Это ошибка в старых версиях MSV C.

Эта ошибка была исправлена ​​в MSV C версии 19.22 и компилируется без ошибок. Здесь мы видим бок о бок две версии компилятора: https://godbolt.org/z/79kXFm

Все версии после и включающие 19.22 включают его компиляцию, но версия 19.21 и ниже неправильно выдают ошибку C3615 хотя они оба настроены на использование C ++ 11.

G CC и Clang никогда не имел этой ошибки.

Эта ошибка была только в MSV C, и даже очень старые версии G CC и Clang компилируют код без давая вам ошибку.

Что делать?

Если возможно, вам следует просто перейти на более новую версию Visual Studio. Это самый простой способ обновить компилятор, и если вы перейдете на более новую версию, компилятор должен получать исправления ошибок и обновления. Если это не вариант, я бы предложил различные способы обновления только самого компилятора. Это может быть полезно .

...