c++ - retorno - Deducción del tipo de argumento de plantilla por operador de conversión
tipos de funciones en c (1)
Esto fue cubierto por CWG issue # 349 , abierto por un desarrollador de EDG C ++ front end (que aparentemente deduce int
, not const int
):
Nos encontramos con un problema relacionado con las conversiones de calificación al hacer una deducción del argumento de la plantilla para las funciones de conversión.
La pregunta es: ¿Cuál es el tipo de T en las funciones de conversión llamadas por este ejemplo? ¿T es "int" o "const int"?
Si T es "int", la función de conversión en la clase A funciona y la de la clase B falla (porque la expresión de retorno no se puede convertir al tipo de retorno de la función). Si T es "const int", A falla y B funciona.
Debido a que la conversión de calificación se realiza sobre el resultado de la función de conversión, no veo ningún beneficio en deducir T como const int.
Además, creo que el código en la clase A es más probable que ocurra que el código en la clase B. Si el autor de la clase estaba planeando devolver un puntero a una entidad const, esperaría que la función se haya escrito con una const en el tipo de retorno.
En consecuencia, creo que el resultado correcto debería ser que T es int.
struct A { template <class T> operator T***() { int*** p = 0; return p; } }; struct B { template <class T> operator T***() { const int*** p = 0; return p; } }; int main() { A a; const int * const * const * p1 = a; B b; const int * const * const * p2 = b; }
Acabamos de implementar esta característica y, a la espera de una aclaración por parte del comité, deducimos T como int. Parece que g ++ y el compilador de Sun deducen T como const int.
Esto solo trajo el párrafo citado a la existencia (¡no existía en C ++ 03!), Y supuestamente fue ignorado por los desarrolladores del compilador.
Veo un ejemplo del Estándar C ++ 11 (n3337, 14.8.2.3/7)
struct A {
template <class T> operator T***();
};
A a;
const int * const * const * p1 = a; // T is deduced as int, not const int
e intenta reproducirlo por diferentes compiladores. Cambié un poco el ejemplo al agregar una declaración con el tipo T en una función de conversión
struct A {
template <class T> operator T***()
{
T t; //if T==const int, then it is error (uninitialized const)
return nullptr;
}
};
A a;
const int * const * const * p1 = a;
int main(){}
Todos los compiladores (VS2014, gcc 5.1.0 y clang 3.5.1) dan un error en la declaración de "t", lo que significa que T se deduce como const int. ¿Porqué es eso? ¿Es alguna extensión?