[All of the following was tested using Visual Studio 2008 SP1]
In C++, const qualification of parameter types does not affect the type of a function (8.3.5/3: "
It's a bug, and it's not specific to C++/CLI.
https://connect.microsoft.com/VisualStudio/feedback/details/100917/argument-const-ness-is-part-of-member-function-type-signature
Fact is, the C++ compiler is supposed to strip off top-level const/volatile. Only const/volatile on the pointed-to type of a pointer or reference matters. If the compiler did that correctly, the CLR wouldn't have a say in what's going on.
BTW this is the IL generated by the compiler with /clr:pure
.class private abstract auto ansi beforefieldinit Base
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 1
L_0000: ldarg.0
L_0001: call instance void [mscorlib]System.Object::.ctor()
L_0006: ret
}
.method public hidebysig newslot abstract virtual instance void Foo(int32 modopt([mscorlib]System.Runtime.CompilerServices.IsConst)) cil managed
{
}
}
.class private auto ansi beforefieldinit Derived
extends Base
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 1
L_0000: ldarg.0
L_0001: call instance void Base::.ctor()
L_0006: ret
}
.method public hidebysig virtual instance void Foo(int32 i) cil managed
{
.maxstack 0
L_0000: ret
}
}
This definitely violates the rule James listed concerning deletion of top-level qualifiers.
Further relevant sections of the C++/CLI spec:
8.8.10.1 Function overriding
[snip]
- A derived class function explicitly overrides a base class virtual function having the same name, parameter-type-list, and cv-qualification, by using the function modifier override, with the program being ill-formed if no such base class virtual function exists
12.3 Declarator types
The C++ Standard (§8.3.5/3) is augmented, as follows:
The resulting list of transformed parameter types and the presence or absence of the ellipsis is the function’s parameter-type-list.
So I am led to believe that the rule on deletion of cv-qualifiers applies to C++/CLI as well, because the spec specifically calls out section 8.3.5/3 of ISO Standard C++.