multiple herencia expresiones ejemplo ambiguas c++ c++11

c++ - herencia - 10 expresiones ambiguas



Inicializador de C++ 11 con función ambigua id-expresión? (1)

En el siguiente código de C ++ 11:

void f(int) {} void f(double) {} void (*p)(int) = f;

Hay dos funciones.

El tercer identificador f es una expresión-id y el inicializador de p .

En 5.1.1p8 [expr.prim.general] / 8 dice:

El tipo de [id-expresión] es el tipo del identificador. El resultado es la entidad denotada por el identificador. El resultado es un lvalor si la entidad es una función, una variable o un miembro de datos y, de lo contrario, un prvalor.

Dado que f podría estar refiriéndose a dos entidades diferentes con dos tipos diferentes, no hay "la entidad" o "el tipo".

¿Hay algún otro texto en el estándar que aborde esta situación?

¿Las implementaciones simplemente desambiguan esto como una extensión o se requieren en algún lugar? (Sin algún otro texto, se podría argumentar que una implementación podría rechazar la expresión-id como ambigua).


El estándar (en § 13.4) define que:

El uso de un nombre de función sobrecargado sin argumentos se resuelve en ciertos contextos a una función, un puntero a función o un puntero a función miembro para una función específica del conjunto de sobrecarga. Se considera que un nombre de plantilla de función nombra un conjunto de funciones sobrecargadas en tales contextos. La función seleccionada es aquella cuyo tipo es idéntico al tipo de función del tipo de destino requerido en el contexto .

Énfasis mío.

Después de la cita, hay un ejemplo (en § 13.4 / 5) que se parece al suyo:

int f(double); int f(int); int (*pfd)(double) = &f; // selects f(double) int (*pfi)(int) = &f; // selects f(int)

En lo que respecta al unario & se refiere, la norma especifica que (en § 5.3.1 / 6 y gracias a jogojapan ):

La dirección de una función sobrecargada se puede tomar solo en un contexto que determina de manera única a qué versión de la función sobrecargada se hace referencia.

pero también se puede omitir (en § 13.4 / 1):

El nombre de la función sobrecargada puede ir precedido por el operador &.

(de nuevo, énfasis mío) tal como lo hiciste, en tu ejemplo.