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.


  • Mod

    Sowohl bei shared_ptr<const Derived> als auch bei shared_ptr<Base> muss ein Template-Konstruktor aufgerufen werden, da beide andere Typen sind als shared_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 ;).


  • Mod

    Enumerator schrieb:

    Wat, jetzt nochmal auf deutsch ;).

    Warum überhaupt ein const bei shared_ptr<const Derived> ?



  • Schonmal was von const-correctness gehört, Arcoth?


  • Mod

    hustbaer schrieb:

    Schonmal was von const-correctness gehört, Arcoth?

    Nein, hustbaer, erzähl mir davon!
    P.S.: Wenn beide Konstruktoren einen shared_ptr mit const nehmen würden, wäre es selbstverständlich immer noch zweideutig.


Anmelden zum Antworten