2011-11-17 16 views
6

Duplicar posible:
List of C++ name resolution (and overloading) rulessobrecarga de funciones en C++

¿Cuáles son las reglas en C++ de cómo decide el compilador que funcionan para elegir? (se le dan dos funciones con el mismo nombre: cómo el compilador selecciona/prioriza una función sobre la otra, principalmente quiero saber qué tipos de conversión el compilador está más dispuesto a hacer cuando lo desee)

+1

¿Se refiere a la anulación? – MGZero

+2

Las reglas son muchas ... y complicadas. Todo esto está cubierto en la sección ** 3.4 ** del estándar C++ –

+0

@MGZero - no ... – Belgi

Respuesta

4

Como ya se indicó, las reglas se describen completamente en la norma. Como regla básica, el compilador seleccionará la sobrecarga que requiere las conversiones menos automáticas, con la advertencia de que nunca aplicará 2 conversiones definidas por el usuario.

Los tipos de enteros se arrojan automáticamente alrededor de un montón. Por lo tanto, si tiene una función sobrecargada en int y double, la compilación elegirá la función int si se llama con una constante que es un número entero. Si no tenía la versión int, el compilador seleccionaría la double. Y entre varios tipos de enteros, el compilador prefiere int para las constantes enteras, porque ese es su tipo. Si se sobrecargó en short y unsigned short, pero se llamó con una constante de 5, el compilador se quejaría de que no podía determinar qué sobrecarga usar.

El libro de Scott Meyers realmente tiene la mejor explicación que he leído.

+0

"Scott Meyers 'book". ¿Podrías ser más específico al nombrar el título del libro? –

+0

Por mi vida, no puedo encontrarlo ahora. +1 a cualquier persona con la referencia? – drdwilcox

+0

Libros de Scott Meyers: http://www.aristeia.com/books.html; la referencia es probablemente a C++ efectivo o posiblemente a C++ más efectivo. – pnkfelix

0

el nombre completo de la función se compone de lo que usted llamó la función, así como la lista de parámetros. Entonces, lógicamente, 2 funciones llaman lo mismo, pero con diferentes listas de parámetros ambas tienen diferentes "nombres completos". Mi terminología probablemente esté un poco desajustada, así que si alguien quiere corregir eso, siéntete libre.

+1

di que tienes doSomething (int x) y doSomething (short x), ¿cuál elige el compilador cuando llamas doSomething (5)? – Tom

+0

¡Ahh, eso lo hace más interesante! Buena pregunta, y también más allá del alcance de mi conocimiento. Siento que dependería de lo que el compilador 5 considere. Me inclino a decir int, pero no estoy seguro en absoluto. – MGZero

+1

Escogerá la versión 'int'. – drdwilcox

0

Se basa en el tipo de argumento (s). No se involucra el casting si el tipo no coincide simplemente no se compilará.

+0

Ver mi comentario sobre la publicación de MGZero – Tom

+0

Por lo que sé si tiene void f (doble x) y llama a f (5) comiles y 5 a cambio a 5.0 – Belgi