Forum: PC-Programmierung Frage zu C++-Konstante


von Sabi (herr_flitzpiep)


Angehängte Dateien:

Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

Sabi schrieb:
> Warum ist i vom Typ const int&?

Ist es nicht. Wer sagt das?

von Wilhelm M. (wimalopaan)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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

von Sabi (herr_flitzpiep)


Lesenswert?

Stefan F. schrieb:
> Sabi schrieb:
>> Warum ist i vom Typ const int&?
>
> Ist es nicht. Wer sagt das?

Steht rechts: "i is const int&".

von Wilhelm M. (wimalopaan)


Lesenswert?

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
von Stefan F. (Gast)


Lesenswert?

Sabi schrieb:
> Wer sagt das?
> Steht rechts: "i is const int&".

Wer hat diesen Kommentar geschrieben? Frage denjenigen, warum er das 
behauptet.

von Oliver S. (oliverso)


Lesenswert?

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

von Sabi (herr_flitzpiep)


Lesenswert?

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.

von Sabi (herr_flitzpiep)


Lesenswert?

@Oliver S.
Ja, so ist es anscheinend.

von Rolf M. (rmagnus)


Lesenswert?

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
von Sabi (herr_flitzpiep)


Lesenswert?

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".]

von Oliver S. (oliverso)


Lesenswert?

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

von Wilhelm M. (wimalopaan)


Lesenswert?

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".

von Rolf M. (rmagnus)


Lesenswert?

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?

von Oliver S. (oliverso)


Lesenswert?

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
Noch kein Account? Hier anmelden.