Hallo, ich habe eine Frage zum angehängten Ausschnitt: Warum ist i vom Typ const int&? Ist i nicht const int? Um den Rest dort (T, T&&) geht es mir nicht. HFP
Sabi schrieb: > Hallo, > > ich habe eine Frage zum angehängten Ausschnitt: Warum ist i vom Typ > const int&? Ist i nicht const int? Um den Rest dort (T, T&&) geht es mir > nicht. i ist vom Typ const int. Schau Dir einfach mal die Ausgabe von
1 | decltype(i)::_; |
an. Oder hast Du es mit T verwechselt, was tatsächlich const i& ist.
Die kurze Antwort lautet: ist halt so. Oder wie cppreference schreibt: "If P is an rvalue reference to a cv-unqualified template parameter (so-called forwarding reference), and the corresponding function call argument is an lvalue, the type lvalue reference to A is used in place of A for deduction". Mit f(42) bekämst du einen int (da rvalue). Oliver
Stefan F. schrieb: > Sabi schrieb: >> Warum ist i vom Typ const int&? > > Ist es nicht. Wer sagt das? Steht rechts: "i is const int&".
Sabi schrieb: > Stefan F. schrieb: >> Sabi schrieb: >>> Warum ist i vom Typ const int&? >> >> Ist es nicht. Wer sagt das? > > Steht rechts: "i is const int&". Wie ich oben schon schrieb: das bezieht sich auf T. Kommentare altern anders als der Code ;-)
:
Bearbeitet durch User
Sabi schrieb: > Wer sagt das? > Steht rechts: "i is const int&". Wer hat diesen Kommentar geschrieben? Frage denjenigen, warum er das behauptet.
Sabi schrieb: > Steht rechts: "i is const int&". Das ist halt falsch. Der ganze englische Text ist eh Murks: "We should deduce..". "Wir" sollen da gar nichts "deducen". Der Typ von t wird den nach den Regeln von C++ gebildet, und fertig. Oliver
Danke für die Antworten, aber finde den Satz immer noch komisch. "i is const int&, so we should deduce T such that T&& is const int&". Wenn sich der Satzanfang auf T bezieht, ergibt das folgende "so we should deduce T" ja keinen Sinn. @Stefan > Wer hat diesen Kommentar geschrieben? Das Ganze ist aus CppCon 2016: Arthur O'Dwyer “Template Normal Programming (part 1 of 2)” https://youtu.be/vwrXHznaYLA?t=2508 Wie gesagt, das war nur ein Ausschnitt, weil ich nicht gar nicht auf die Typdeduktion etc. eingehen wollte, sondern schon über den Anfang gestolpert bin.
Sabi schrieb: > https://youtu.be/vwrXHznaYLA?t=2508 Da sieht das aber etwas anders aus. Der Kommentar steht in der Zeile des Funktionsaufrufs und bezieht sich offenbar auch darauf. Gemeint war wohl eigentlich, dass i als const int& an die Funktion übergeben wird. Daraus leitet sich ab, dass T&& zu einem const int& werden muss, was nach den in dem Video gezeigten Regeln möglich ist. Ich denke, darauf wollte er hinaus, auch wenn die Formulierung etwas ungeschickt ist.
:
Bearbeitet durch User
Rolf M. schrieb: > Gemeint war wohl eigentlich, dass i als const int& an die Funktion > übergeben wird. Daraus leitet sich ab, dass T&& zu einem const int& werden > muss, was nach den in dem Video gezeigten Regeln möglich ist. Ich denke, > darauf wollte er hinaus, auch wenn die Formulierung etwas ungeschickt ist. Das ergibt Sinn. Danke! Dann ist einerseits die Formulierung, dass i vom Typ const int& ist, so nicht korrekt - Funktionsaufruf hin oder her -, andererseits war eben Herr Flitzpiep am Werk ... ["weil ich nicht gar nicht" sollte natürlich heißen "weil ich gar nicht".]
Rolf M. schrieb: > Gemeint war wohl > eigentlich, dass i als const int& an die Funktion übergeben wird. Der Funktionsparamter i ist ein lvalue vom type const int. Kein int&, und auch nix anders. Daraus wird der type des Templatparameters als int& "deduced". Dabei wird das const ignoriert, aber das wars dann auch schon. Oliver
Oliver S. schrieb: > Daraus wird der type des Templatparameters als int& "deduced". Das geht ganz einfach auch in Deutsch: der Typ wird abgeleitet. Das Ganze (nicht cv-qualifizierter rvalue-reference TTP) nennt sich dann "forwarding reference".
Oliver S. schrieb: > Rolf M. schrieb: >> Gemeint war wohl >> eigentlich, dass i als const int& an die Funktion übergeben wird. > > Der Funktionsparamter i ist ein lvalue vom type const int. i ist kein Funktionsparameter, sondern eine lokale Variable. Und die wird als Argument an den Parameter t vom Typ const int& übergeben. > Kein int&, und auch nix anders. > Daraus wird der type des Templatparameters als int& "deduced". const int& > Dabei wird das const ignoriert, aber das wars dann auch schon. Warum sollte das const ignoriert werden?
Rolf M. schrieb: >> Dabei wird das const ignoriert, aber das wars dann auch schon. > > Warum sollte das const ignoriert werden? Stimmt, da war ich geistig woanders. Oliver
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.