Folgende funktioniert gut (wie man erwarten würde):Template-Umwandlungsfunktion zu konst Verweis
struct X {};
struct A
{
operator X const&()
{
static const X value{};
return value;
}
};
int main()
{
A a;
X x = a;
}
Aber das ist nicht so klar:
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 sagt error: conversion from ‘A’ to non-scalar type ‘X<int>’ requested
während Klirren 3.4 hat keine Probleme damit. Wenn Sie die const
oder die &
aus der Konvertierungsfunktion entfernen oder wenn Sie X<int> const &x = a
schreiben, dann ist GCC auch glücklich.
So findet GCC die Konvertierungsfunktion nur dann nicht, wenn der Zieltyp eine const &
zu einer Vorlagenklasse ist und Sie eine Konvertierung in ein nicht const &
Objekt dieser Klasse anfordern. Ist das das richtige Verhalten? Ich habe versucht, den Standard zu lesen, aber die Überladungsregeln sind ziemlich verwirrend für mich.
Dank Ihrer guten Erklärung und dem Link zum Fehlerbericht habe ich einen Fehlerbericht eingereicht: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61663 –