Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

idontknow

unregistriert

1

23.06.2016, 12:33

Compiler Template Magie - const C::reference vs. C::const_reference

Hi,

ich hab einen Container-Typ als Template Parameter (C) übergeben und dabei festgestellt, dass er im Template das "const" in "const C::reference" nicht erkennt / merkt. D.h. ich bekomme dann einen Fehler "cannot convert argument 2 from const int to int&"

Gelöst habe ich das indem ich anstelle von "const C::reference" "C::const_reference" verwende, ich würde nur gerne wissen warum das so ist, da ich meinen Fehler nicht erkenne oder gar verstehe! Ich habe das auf gut Glück probiert und es hat geklappt, aber es war ein reiner Versuch und nicht darauf begründet, dass ich gewusst hätte was das Problem ist.

TL;DR;
2 Dinge die ich nicht verstehe:
(1) Warum funktioniert const C::reference nicht, aber C::const_reference schon
(2) Warum will der Compiler von "const int" nach "int&" konvertieren, müsste der Ausgangstyp nicht bereits "const int&" sein (also auch mit Reference?)

Hier noch der Beispiel Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
template <typename R, typename C>
R do_something(const C& c) {
    return std::accumulate(std::begin(c), std::end(c), R(),
        [](const R& a, const C::reference b) { return a + b; });
}

// Aufruf:
std::vector<int> vec = { 1, 2, 3 };
do_something<int, std::vector<int> >(vec);


Vielen Dank schonmal.

2

23.06.2016, 14:17

Ein std::vector<int>::reference ist ein int&. Ein const std::vector<int>::reference ist ein int& const, vgl mit int* const, ein konstanter Zeiger auf ein int. Soetwas geht mit Referenzen nicht, die sind ja schließlich immer konstant.