tipos retorno predefinidas parametros funciones funcion ejemplos con c++ templates c++11 operator-overloading type-deduction

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?