Я хочу различить оператор преобразования шаблона между &, * и значениями:
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