C ++ vs. C ++ / CLI: calificación constante de parámetros de funciones virtuales

[Todo lo siguiente fue probado usando Visual Studio 2008 SP1]

En C ++, la calificación constante de los tipos de parámetros no afecta el tipo de una función (8.3.5 / 3: "Se elimina cualquier calificador cv que modifique un tipo de parámetro")

Entonces, por ejemplo, en la siguiente jerarquía de clases,Derived::Foo anulaBase::Foo:

struct Base
{
    virtual void Foo(const int i) { }
};

struct Derived : Base
{
    virtual void Foo(int i) { }
};

Considere una jerarquía similar en C ++ / CLI:

ref class Base abstract
{
public:
    virtual void Foo(const int) = 0;
};

ref class Derived : public Base
{
public:
    virtual void Foo(int i) override { }
};

Si luego creo una instancia deDerived:

int main(array<System::String ^> ^args)
{
    Derived^ d = gcnew Derived;
}

Se compila sin errores ni advertencias. Cuando lo ejecuto, arroja la siguiente excepción y luego termina:

Se produjo una excepción no controlada del tipo 'System.TypeLoadException' en ClrVirtualTest.exe

Información adicional: El método 'Foo' en el tipo 'Derivado' ... no tiene implementación.

Esa excepción parece indicar que la calificación constante del parámetrohace afectar el tipo de la función en C ++ / CLI (o, al menos, afecta la anulación de alguna manera). Sin embargo, si comento la línea que contiene la definición deDerived::Foo, el compilador informa el siguiente error (en la línea demain donde la instancia deDerived se instancia):

error C2259: 'Derivado': no se puede instanciar la clase abstracta

Si agrego el calificador const al parámetro deDerived::Foo o elimine el calificador const del parámetro deBase::Foo, se compila y se ejecuta sin errores.

Creo que si la calificación constante del parámetro afecta el tipo de la función, debería obtener este error si la calificación constante del parámetro en la función virtual de clase derivada no coincide con la calificación constante del parámetro en la clase virtual virtual función.

Si cambio el tipo deDerived::Foo'parámetro de unint a undouble, Recibo la siguiente advertencia (además del error mencionado anteriormente, C2259):

advertencia C4490: 'anulación': uso incorrecto del especificador de anulación; 'Derived :: Foo' no coincide con un método de clase de referencia base

Entonces, mi pregunta es, efectivamente, ¿la calificación constante de los parámetros de la función afecta el tipo de función en C ++ / CLI? Si es así, ¿por qué esto se compila y por qué no hay errores o advertencias? Si no, ¿por qué se lanza una excepción?

Respuestas a la pregunta(2)

Su respuesta a la pregunta