Merkwürdiges Verhalten vom auto-Keyword



  • Hallo,

    mir ist im Zusammenhang mit dem auto-Keyword in MS Visual Studio 2010 ein Verhalten aufgefallen, das sehr merkwürdig ist. Oder ist es ein Fehler im Compiler.

    Ich habe einen Container Queue in dem ich Elemente einer Klasse verwalte. Mit der Methode getJob hole ich mir eine Referenz auf ein Objekt. Bei diesem Objekt will ich den Value verändern.

    Wenn ich das auto-Keyword verwende, erwarte ich das die Variable j vom Typ Referenz auf Job ist, weil dies der Rückgabetyp von getJob ist. Er gibt aber
    keine Referenz zurück, sondern die Variable direkt.

    auto j = q.getJob(3);
    

    Wenn ich die Variable j direkt als Referenz auf Job definiere, klappt alles super.

    Job& j = q.getJob(3);
    

    Hier ein lauffähiges Beispiel, das das Problem zeigt.

    Hinweis: Dies ist ein vereinfachtes Beispiel, das das mein Verständnisproblem verdeutlich und nicht komplett.

    #include "stdafx.h"
    
    #include <iostream>
    #include <vector>
    
    class Job
    {
    	int m_id;
    	int m_value;
    
    public:
    	Job() : m_id(0), m_value(0) {}
    	Job(const int id, const int value) : m_id(id), m_value(value) {}
    
    	int id() const {return m_id;}
    	int value() {return m_value;}
    	void value(const int v) {m_value = v;}
    };
    
    class Queue
    {
    	std::vector<Job> v;
    
    public:
    	Queue() 
    	{
    		v.push_back(Job(1, 12));
    		v.push_back(Job(2, 24));
    		v.push_back(Job(3, 36));
    		v.push_back(Job(4, 48));
    		v.push_back(Job(5, 60));
    		v.push_back(Job(6, 72));
    	}
    
    	Job& getJob(const int id)
    	{
    		for (auto it(v.begin()); it != v.end(); ++it)
    			if ((*it).id() == id)
    				return *it;
    	}
    
    	template<typename C>
    	void showContainer(C c)
    	{
    		for (auto it(c.begin()); it != c.end(); ++it)
    			std::cout << (*it).id() << " : " << (*it).value() << std::endl;
    	}
    
    	void showQueue() {showContainer(v);}
    };
    
    int main()
    {
    	Queue q;	
    
    	q.showQueue();
    
    	auto j = q.getJob(3);
    	// Job& j = q.getJob(3);
    	j.value(30);
    
    	q.showQueue();
    
    	std::cin.get();
    
    	return 0;
    }
    

    Kann einer dieses Verhalten erklären

    Gruss
    Ludger



  • Acho schrieb:

    Wenn ich das auto-Keyword verwende, erwarte ich das die Variable j vom Typ Referenz auf Job ist, weil dies der Rückgabetyp von getJob ist.

    Damit erwartest du was falsches. Laut Standard ist eine Variable, die mit auto deklariert/definiert wird, nie "von selbst" eine Referenz. Du musst also explizit dran schreiben, dass du nur eine Referenz und keine Kopie haben möchtest.

    auto& j = q.getJob(3);
    


  • Danke!

    Dann liefert auto nur den Typ!

    Mit

    auto& j = q.getJob(3);
    

    klappt es auch. Super

    Gruss
    Ludger



  • Dann liefert auto nur den Typ!

    So einfach ist es nicht. Wenn deine Funktion z.B. ein Job* zurückgegeben hätte, wäre der deduzierte Typ auch Job*.

    Für die Deduktion bei auto gelten die gleichen Regeln wie bei der Deduktion von Template Argumenten.



  • Danke für diesen Hinweis,

    damit muss ich mich nochmal beschäftigen. Gibt es über das Thema (Deduktion von Template Argumenten) eine gute Dokumentation im Web bzw. Buch.

    Gruss
    Ludger.



  • Acho schrieb:

    Gibt es über das Thema (Deduktion von Template Argumenten) eine gute Dokumentation im Web bzw. Buch.

    Google doch mal nach "template argument deduction", da sollte auf jeden Fall was dabei sein - die Video-Vorlesung von STL dürfte auf jeden Fall schonmal ein guter Aufhänger sein. Als Buch ist in dem Zusammenhang "C++ Templates - The Complete Guide" von Josuttis/Vandervoorde zu empfehlen.



  • Danke,

    das Buch steht sogar schon im Regal. Hatte bisher nurnoch nicht die Zeit es zu lesen. Und Lonks zu den Videos über die STL hatte ich mir auch schon gespeichert.

    Nochmals Danke
    Ludger.



  • Acho schrieb:

    Lonks zu den Videos über die STL hatte ich mir auch schon gespeichert.

    STL != STL 😉
    Ich meine nicht Videos über die STL (Standard Template Library, was manche etwas fahrlässig inkorrekt mit der C++-Standardbibliothek gleichsetzen), sondern Videos von STL (Stephan T. Lavavej, einer der Bibliotheksentwickler von MS)



  • Danke für den Hinweis,

    die Core C++ sind mir neu, aber sehr interessant.

    Gruss
    Ludger.


Anmelden zum Antworten