Poniższe działa dobrze (jak można by oczekiwać):Szablon funkcji konwersji do const odniesień
struct X {};
struct A
{
operator X const&()
{
static const X value{};
return value;
}
};
int main()
{
A a;
X x = a;
}
Ale to nie jest tak oczywiste:
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 mówi error: conversion from ‘A’ to non-scalar type ‘X<int>’ requested
natomiast Clang 3.4 ma żadnych problemów z tym. Jeśli usuniesz const
lub &
z funkcji konwersji lub jeśli napiszesz X<int> const &x = a
, GCC również jest szczęśliwy.
W związku z tym GCC nie może znaleźć funkcji konwersji, jeśli typ docelowy to const &
dla klasy szablonu, a użytkownik żąda konwersji na obiekt inny niż const &
tej klasy. Czy to jest prawidłowe zachowanie? Próbowałem odczytać standard, ale zasady przeładowania są dla mnie dość mylące.
Dzięki waszemu wspaniałemu wyjaśnieniu i linkowi do raportu o usterce zgłosiłem zgłoszenie błędu: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61663 –