Шаблон метапрограммирования - G ++ ест, Clang нет - PullRequest
3 голосов
/ 10 марта 2019

Есть ли способ заставить оба компилятора быть счастливыми?

для этого:

template<short value>
struct static_signbits
{
    enum { result = (!!(value & 0x8000) == !!(value & 0x4000)) ? (static_signbits<short(value << 1)>::result + 1) : 0 };
};

template<>
struct static_signbits<0>
{
    enum
    {
        result = 15
    };
};

лязг дает мне:

error: non-type template argument is not a constant expression
        enum { result = (!!(value & 0x8000) == !!(value & 0x4000)) ? (static_signbits<short(value << 1)>::result + 1) : 0 };
                                                                                      ^~~~~~~~~~~~~~~~~  

Видимо, недовольны броском на шорт?

Очевидно, я мог бы использовать constexpr вместо этого, но мне также требуется обратная совместимость с C ++ 98

1 Ответ

3 голосов
/ 10 марта 2019

Это потому, что clang не поддерживает negative << n в константных выражениях. Вместо этого просто измените значения без знака:

template<short value>
struct static_signbits
{
    enum { result = (!!(value & 0x8000) == !!(value & 0x4000)) ? (static_signbits<(short)((unsigned)value << 1)>::result + 1) : 0 };
};

лязг верен, так как отрицательное смещение влево равно неопределенное поведение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...