2010-11-30 8 views
0

Es tut mir sehr leid für meine vorherige Verfälschung. So umformuliert ich diese Frage wie folgt:Warum verhält sich ref in C++ 0x nicht wie erwartet?

Die einfachste C++ 0x-Code unten sollte nicht gültig sein:

#include <functional> 

template<class T_> 
void f(T_ obj) 
{ 
    Obj++; // OK that is as expected. 
    static_cast<int&>(obj) = 2; // Though ugly, this is still OK. 

    obj = 2; // However, this line will generate a compiler error 
} 

int main() 
{ 
    int i = 1; 
    f(std::tr1::ref(i)); 
} 

Wer kann mir sagen, die genaue Semantik ref?

+6

Was ist 'ref'? Bitte poste ein komplettes, kompilierbares Programm. –

+0

Dies ist nicht gültig C++ .. – Simone

+2

-1 unvollständiger Code, undefined Begriffe, Behauptung der subjektiven Überzeugung über die undefinierte Sache –

Antwort

1

Die Ursache des Fehlers ist, dass es keinen geeigneten Zuweisungsoperator gibt. Der einzige Kandidat ist dies:

reference_wrapper& operator=(const reference_wrapper<T>& x); 

A reference_wrapper dient als Referenz mit Hilfe der impliziten Umwandlung Operatoren:

operator T&() const; 

jedoch eine implizite Konvertierung wird nicht auf der linken Seite des Zuweisungsoperators passieren .

Wenn Sie diese Vorlage erwarten reference_wrapper zu unterstützen, vielleicht können Sie in einer Weise, wie dies umgehen:

#include <functional> 
#include <iostream> 

template <class T> 
T& get(T& value) 
{ 
    return value; 
} 

template <class T> 
T& get(std::reference_wrapper<T>& w) 
{ 
    return w.get(); 
} 


template<class T_> 
void f(T_ obj) 
{ 
    //obj = 2; 
    get(obj) = 2; 
} 

int main() 
{ 
    int i = 1; 
    f(std::ref(i)); 
    std::cout << i << '\n'; 
    f(3.14); //at the same time, we want this also to work 
} 

Wie, warum reference_wrapper nicht einen Zuweisungsoperator für gespeicherte Typen hat, nicht sicher. Die Boost-Version hat auch keine und sie sagen einfach, dass diese Klasse "den Funktionsschablonen normalerweise erlaubt, auf unmodifizierten Referenzen zu arbeiten". Schätze, das ist einfach keiner dieser Fälle.

+0

Ihre Lösung funktioniert. Aber das sieht nicht nach der einheitlichsten Art aus, eine echte Referenz und einen reference_wrapper zu behandeln. Meiner Meinung nach, get (obj) = 2; ist weit von elegant als obj = 2; – xmllmx

+0

@UncleBens: "Warum reference_wrapper keinen Zuweisungsoperator für den gespeicherten Typ hat, ist nicht sicher. Die Boost-Version hat auch keine und sie sagen einfach, dass diese Klasse" den Funktionsschablonen normalerweise erlaubt, auf Referenzen unmodifiziert zu arbeiten. "Ich denke, das ist einfach keiner dieser Fälle." – xmllmx

+0

@UncleBens: Ihre Erklärung ist überzeugend. Ich denke, dies ist beabsichtigt, um das referenzierte Objekt implizit zu ändern. – xmllmx

Verwandte Themen