programas programar funciones ejemplos como comandos codigos caracteristicas c++ c++11 type-conversion const language-lawyer

programar - ejemplos de programas en c++ pdf



¿Por qué se permiten diferentes funciones de conversión para int y const int? (4)

por qué tiene sentido permitir diferentes versiones (basadas en la constancia) del operador de conversión (para compilar) cuando su uso siempre resulta en ambigüedad;

Por lo general, no tiene sentido (aparte de los casos de uso altamente artificiales) y un compilador podría advertirle al respecto:

prog.cc:12:25: warning: type qualifiers ignored on function return type [-Wignored-qualifiers] operator const int() ^

¿Por qué se permite compilar lo siguiente en C ++?

#include<iostream> using namespace std; class mytest { public: operator int() { return 10; } operator const int() { return 5; } }; int main() { mytest mt; //int x = mt; //ERROR ambigious //const int x = mt; //ERROR ambigious }

¿Por qué tiene sentido permitir que se compilen diferentes versiones (basadas en la constancia) del operador de conversión cuando su uso siempre resulta en ambigüedad?

¿Alguien puede aclarar lo que me estoy perdiendo aquí?


Creo que en el sentido más estricto, aunque no tenga mucho sentido para la const , esto es legítimo.

Hay una diferencia entre una declaración de función y un tipo de función, y no tienen las mismas restricciones.

Las declaraciones de funciones pueden no diferir solo en su tipo de devolución o en la especificación de excepción (desde C ++ 17). Sin embargo, no se dice nada sobre el tipo de función (que yo sepa).

El estándar [class.conv.fct] describe las funciones de conversión como tener tal y cual forma (tres alternativas enumeradas), todas las cuales no se parecen a las declaraciones de funciones normales, en particular, muy obviamente no tienen tipo de retorno.

Indica que el tipo de función es "función que no retorna ningún parámetro de conversión de tipo-id" , pero en ninguna parte se menciona que las declaraciones de función de conversión tienen algo así como un tipo de retorno. Por el contrario, las tres formas alternativas enumeradas muy claramente no tienen un tipo de devolución.

Dado que las funciones de conversión no tienen un tipo de retorno (... en su declaración), no puede entrar en conflicto. Entonces, supongo que, en el sentido más estricto y pedante, es incluso algo "legal", tenga sentido o no.

Si lo piensas, de alguna manera también tiene que ser legal. Una clase puede muy bien tener más de una función de conversión para diferentes cosas (no solo diferenciándose por const ). Tal código existe, y a veces tiene mucho sentido ir de esa manera.
Por ejemplo, podría tener un File clase que se convierta en una string (el nombre del archivo) o en un handle_t (el controlador del sistema operativo) en caso de que desee utilizar alguna función exótica o específica del sistema operativo que su clase de envoltorio no admita directamente (¿Piensa writev , tee , o epoll ?) ¡Ciertamente es algo que esperas que funcione!
Sin embargo, si tratáramos las funciones de conversión como "funciones simples", entonces solo diferirían en su tipo de devolución, lo que haría que las declaraciones fueran ilegales. Entonces ... eso no funcionaría.


Llegué a la conclusión de que no está explícitamente permitido escribir operadores de conversación que solo difieran por la constancia de su valor de retorno. Es demasiado caro que el proceso de compilación no lo permita explícitamente.

Recuerde que las funciones (miembro) que solo difieren según su tipo de devolución

class mytest { int f(); const int f(); };

están prohibidos

error: ''const int mytest :: f ()'' no se puede sobrecargar

Es solo que los operadores de conversión comienzan con el operator que hace la diferencia.


Para la conversión son ambiguos; pero podrías llamarlos explícitamente. p.ej

int x = mt.operator int(); const int x = mt.operator const int();