Перегрузка оператора преобразования - PullRequest
0 голосов
/ 25 января 2019

Я хочу различить оператор преобразования шаблона между &, * и значениями:

struct S
{
    template <class T>
    constexpr operator T()
    {
        return value;
    }
    template <class T>
    constexpr operator T&()
    {
        return value;
    }
    template <class T>
    constexpr operator T*()
    {
        return &value;
    }
    int value;
} s{5};

int main()
{
    uint32_t ui = s; // error:  error C2440: 'initializing': cannot convert from 'S' to 'uint32_t
}

Если я удаляю constexpr operator T&(), код компилируется и ui = s вызывает оператор constexpr operator T(). Но почему?

Я также получаю странное поведение, когда добавляю явный спецификатор к этим функциям.

Похоже, поведение оператора преобразования отличается от обычной перегрузки. Может кто-нибудь объяснить это?

PS: я использую VS2017

1 Ответ

0 голосов
/ 25 января 2019

Поскольку value имеет тип int, не имеет смысла создавать преобразование шаблона в ссылочный тип параметра шаблона. Если тип не int, у вас есть семантическая ошибка при попытке привести объект int к ссылке другого типа.

Переопределить эталонное преобразование для соответствующих типов:

constexpr operator int&()
{
    return value;
}
constexpr operator const int&() const
{
    return value;
}
...