I seguenti funziona bene (come ci si aspetterebbe):Template conversione a const riferimento
struct X {};
struct A
{
operator X const&()
{
static const X value{};
return value;
}
};
int main()
{
A a;
X x = a;
}
Ma non è così chiaro:
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 dice error: conversion from ‘A’ to non-scalar type ‘X<int>’ requested
mentre clang 3.4 ha nessun problema con esso. Se si rimuove lo const
o lo &
dalla funzione di conversione o se si scrive X<int> const &x = a
, GCC è anch'esso soddisfatto.
Quindi GCC non riesce a trovare la funzione di conversione solo se il tipo di destinazione è un const &
in una classe modello e si richiede una conversione a un oggetto non const &
di quella classe. È questo il comportamento corretto? Ho provato a leggere lo standard ma le regole di sovraccarico mi confondono molto.
Grazie alla tua grande spiegazione e al link al rapporto sui difetti, ho presentato un bug report: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61663 –