Mehrdeutigkeit mit shared_ptr
-
Hi, wer kann mir sagen warum der untere Programmcode mehrdeutig ist, sobald ich aber in der Callback Klasse im zweiten Konstruktor das const wegnehme nicht mehr?
[code="cpp"]#include <memory>
class Base
{
};class Derived : public Base
{
};class Callback
{
public:
Callback(std::shared_ptr<Base> ptr, int i) { std::wcout << L"Base" << std::endl; };
Callback(std::shared_ptr<const Derived> ptr, int i) { std::wcout << L"Derived" << std::endl; };
};int main()
{
std::shared_ptr<Base> base(new Derived());
std::shared_ptr<Derived> derived(new Derived());Callback callback1(base, 42);
Callback callback2(derived, 42);
std::cin.get();
return 0;
}[/code]
-
Weil so für beide Konstruktoren konvertiert werden muss:
Für den ersten: Derived* to Base*
Für den zweiten: Derived* to const Derived*
Diese Konvertierung ist "gleich gut", weswegen unklar ist, welche ausgeführt werden soll.
-
Sowohl bei
shared_ptr<const Derived>
als auch beishared_ptr<Base>
muss ein Template-Konstruktor aufgerufen werden, da beide andere Typen sind alsshared_ptr<Derived>
. Das resultiert natürlich in einer Ambiguität.Wohingegen ohne
const
einfach der Kopierkonstruktor gegenüber dem Template-Konstruktor bevorzugt wird.
-
D.h. hier würde nur helfen, die Funktionsargumente für z. B. den ersten Konstruktor zu vertauschen. Das ist aber auch nicht immer möglich.
-
Warum überhaupt diese Überladung (aus logischer Sicht)? Warum haben Basis- und abgeleitete Klasse verschiedene CV-Qualifizierung?
-
Wat, jetzt nochmal auf deutsch ;).
-
Enumerator schrieb:
Wat, jetzt nochmal auf deutsch ;).
Warum überhaupt ein
const
beishared_ptr<const Derived>
?
-
Schonmal was von const-correctness gehört, Arcoth?
-
hustbaer schrieb:
Schonmal was von const-correctness gehört, Arcoth?
Nein, hustbaer, erzähl mir davon!
P.S.: Wenn beide Konstruktoren einenshared_ptr
mitconst
nehmen würden, wäre es selbstverständlich immer noch zweideutig.