Method overloading with const/non-const variants (was: Re: KDE/kdelibs/kdecore)
thiago at kde.org
Tue Jul 8 13:55:23 BST 2008
Friedrich W. H. Kossebau wrote:
>What about overloaded methods? Hm, running the test from below shows me
> that I have been thinking wrong for many years, duh. So the compiler
> chooses the variant by the constness of the object? I thought it takes
> all possible variants and then narrows the selection further by the
> LHS, going for constness if possible?
>Is this defined by the C++ specs? Does anyone know the rationale behind
Yes, this is defined by the C++ spec. When you call a function foo(...)
with a set of parameters, the compiler will try to find all instances
of "foo" in the class and see which one fits best to the parameters you
I don't know the exact rules for type promotion and demotion, but there
are cases where it becomes ambiguous. If it does, then the compiler will
print an error and ask you what to do.
An interesting thing about the search is when it happens to template
types: no promotion or demotion is applied. The compiler searches only
for the exact match.
The compiler always selects the less constraining overload of a function
given its CV-qualifiers (CV = const, volatile). If you have the following
four overloads of foo():
void foo() const;
void foo() volatile;
void foo() const volatile;
The CV qualifier to a function applies to the this pointer implicit
parameter. So you can think of that as:
void foo(Class *this);
void foo(const Class *this);
void foo(volatile Class *this);
void foo(const volatile Class *this);
So now you can apply the same rules as parameter overloading. That's why
the compiler chooses the less constraining one. That's also why
the "const" variants may be called in any circumstances, but the
non-const ones cannot be called with a const object.
Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org
PGP/GPG: 0x6EF45358; fingerprint:
E067 918B B660 DBD1 105C 966C 33F5 F005 6EF4 5358
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 189 bytes
Desc: This is a digitally signed message part.
More information about the kde-core-devel