Какой компилятор прав? - PullRequest
       58

Какой компилятор прав?

1 голос
/ 29 апреля 2020

Следующий код правильно собирается в clang ++

class Number
{
    int _value;

public:

    constexpr Number(int value): _value(value) {}

    constexpr bool operator==(const Number rhs) const { return _value == rhs._value; }

    constexpr bool isOne() const { return *this == Number::ONE; }

    static const Number ONE;
};

constexpr Number Number::ONE(1);

int main()
{      
    return 0;
}

, но не работает в gcc ++. Возвращаемая ошибка следующая:

Error(s):

266649471/source.cpp: In member function ‘constexpr bool Number::isOne() const’:
266649471/source.cpp:11:65: error: the value of ‘Number::ONE’ is not usable in a constant expression
     constexpr bool isOne() const { return *this == Number::ONE; }
                                                                 ^
266649471/source.cpp:13:25: note: ‘Number::ONE’ was not declared ‘constexpr’
     static const Number ONE;
                         ^~~

Кто здесь? Любой обходной путь для объявления Number :: ONE constexpr внутри Number ?

...