Следующее работает отлично (как и следовало ожидать):
struct X {};
struct A
{
operator X const& ()
{
static const X value{};
return value;
}
};
int main()
{
A a;
X x = a;
}
Но это не так ясно:
template<typename T>
struct X {};
struct A
{
template<typename T>
operator X<T> const& ()
{
static const X<T> value{};
return value;
}
};
int main()
{
A a;
X<int> x = a;
}
GCC 4.9 говорит error: conversion from ‘A’ to non-scalar type ‘X<int>’ requested
, тогда как clang 3.4 не имеет проблем с ним.
Если вы удалите из функции преобразования const
или &
или напишите X<int> const &x = a
, то GCC тоже будет рад.
Таким образом, GCC только не может найти функцию преобразования, если целевой тип - это const &
для класса шаблона, и вы запрашиваете преобразование в объект const &
этого класса. Это правильное поведение? Я попытался прочитать стандарт, но правила перегрузки меня сбивают с толку.