Я не думаю, что причиной является «слишком много шагов для самостоятельной оценки», как указывал DeadMG. У меня были конструкции с 3-4 преобразованиями, и компилятор всегда отлично их понимал.
Я полагаю, что проблема скорее в том, что компилятору не разрешено преобразовывать ссылку const
в ссылку, отличную от const
, от своего имени (это разрешается делать только в том случае, если вы явно указали это с помощью преобразования. ).
А поскольку ссылка на временный объект, который передается в конструктор копирования, является const
, а конструктор копирования - нет, она не находит подходящей функции.
РЕДАКТИРОВАТЬ: Я не нашел никакого "реального" кода (см. Комментарии ниже), но построил пример мультизигзагообразного преобразования, который фактически компилируется без ошибок в gcc 4.5. Обратите внимание, что это прекрасно скомпилируется и с -Wall -Wextra
, что меня откровенно удивляет.
struct B
{
signed int v;
B(unsigned short in) : v(in){}
};
struct C
{
char v;
C(int in) : v(in){}
};
struct A
{
int v;
A(B const& in) : v(in.v){}
operator C() { return C(*this); }
};
enum X{ x = 1 };
int main()
{
C c = A(x);
return 0;
}