implizite konvertierungen



  • hallo, ich konnte meinen quelltext eben nicht kompilieren, hier das minimalbeispiel meines codes:

    template<class T>
    struct storage
    {
    	T data;
    	storage(T data = T())
    		: data(data)
    	{
    	}
    	template<class U>
    	inline operator storage<U> () const // implizit!
    	{
    		return storage<U>(this->data);
    	}
    };
    struct some_class
    {
    	some_class(storage<float> arg = storage<float>()) // implizit!
    	{
    	}
    };
    void f(some_class const& arg)
    {
    }
    int main()
    {
    	storage<float> data1;	
    	f(data1); // geht
    
    	storage<int> data2;
    	f(data2); // geht nicht
    
    	f(some_class(data2)); // geht plötzlich wieder?????
    }
    

    für mich ist es unlogisch dass zeile 30 nicht geht, denn alle dazu nötigen funktionen sind implizit aufrufbar...
    noch unlogischer sieht es für mich aus da ich bei zeile 32 den implizit aufrufbaren konstruktor manuell aufrufe und es dann plötzlich geht. das könnte der compiler bei zeile 30 doch selbst auch machen...

    gruss



  • Bei Konvertierungssequenzen darf nur eine benutzerdefinierte Konvertierung stattfinden.
    Bei deinem zweiten Beispiel müssten aber zwei aufgerufen werden.
    Das macht man, damit man nicht endlos konvertiert und am Ende bei irgendwelchen Typen landet, die keiner haben wollte.



  • siehe auch 13.3.3.1.2 User-defined conversion sequences

    A user-defined conversion sequence consists of an initial standard conversion sequence followed by a userdefined conversion (12.3) followed by a second standard conversion sequence. If the user-defined conversion is specified by a constructor (12.3.1), the initial standard conversion sequence converts the source type to the type required by the argument of the constructor. If the user-defined conversion is specified by a conversion function (12.3.2), the initial standard conversion sequence converts the source type to the implicit object parameter of the conversion function.


Anmelden zum Antworten