es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo C++ deduce la función sobrecargada correcta?

Había 5 versiones diferentes de pow en C++98:

double pow (double base, double exponent);
float pow (float base, float exponent);
long double pow (long double base, long double exponent);
double pow (double base, int exponent);
long double pow (long double base, int exponent);

Mi profesor me dijo que antes de C++11 (antes de agregar la versión de plantilla de pow), podía haber un error en el que C++ no pudiera deducir qué sobrecarga elegir. Eso me pareció razonable. Por ejemplo, considera este código:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    cout << pow(4, 3);
    cin.get();
}

Estoy llamando a la función pow() con dos argumentos enteros. No tengo esa sobrecarga de pow(), ¿entonces tal vez debería hacer algunas conversiones implícitas? Vale, ¿pero cuál elegir? No puedo elegir cómo convertir ya que tengo ambigüedad en la elección de la sobrecarga. Pero intenté compilar este fragmento de código (en modo std=c++98) y funcionó. ¿Por qué?

Bueno, tal vez sea por el segundo argumento que es entero. Por lo tanto, solo tengo que elegir entre double pow (double base, int exponent) y long double pow (long double base, int exponent). Pero aún así, ¿qué decide el compilador elegir? ¿Y si llamo a pow(4, 3ll)? Aún se compila, pero la deducción de tipos para mí es menos obvia.

Act.: Tal vez no sea una buena idea ver cómo funciona la deducción aquí, porque es posible que nunca sepa cómo se implementa realmente pow. ¿O sí?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en C++, específicamente en C++98, había 5 versiones diferentes de la función pow disponibles en esa versión. Estas incluyen:

    • double pow (double base, double exponent);
    • float pow (float base, float exponent);
    • long double pow (long double base, long double exponent);
    • double pow (double base, int exponent);
    • long double pow (long double base, int exponent);

    Antes de C++11, la versión de plantilla de pow aún no estaba disponible. Esto significaba que podía haber un error en el cual el compilador no podía deducir qué sobrecarga de pow elegir. Por ejemplo, si llamábamos a pow(4, 3) con dos argumentos enteros, no existe una sobrecarga de pow que tome dos enteros.

    Sin embargo, cuando intentamos compilar este código en modo std=c++98, todavía funciona. Esto posiblemente se deba a que el compilador puede elegir entre las sobrecargas de double pow (double base, int exponent) y long double pow (long double base, int exponent), ya que el segundo argumento es un entero. No está claro cuál elegirá el compilador en este caso.

    Si llamáramos a pow(4, 3ll), la deducción del tipo se vuelve aún menos evidente. Sin embargo, puede que no sea la mejor idea depender de intentar determinar cómo funciona la deducción, ya que la implementación de pow no se conoce completamente.

Comments are closed.