"const" vor Funktionsrumpf bei template / Rückgabe von T()

26/10/2014 - 12:11 von Bernd Meier | Report spam
template<typename T> T test::get() const {
return T();
}

1)
Obiges Beispiel habe ich in dieser NG (bzgl. einer anderen Frage) vor
Kurzem gefunden. Was bedeutet hier das const und was àndert
sich, wenn man es weglàßt?
Ich kenne const nur in Bezug auf unverànderliche Variablen.

2)
Ist dieses const vor dem Funktionsrumpf eine Spezialitàt
von templates oder kann es auch bei "normalen" Funktionen
eingesetzt werden?

3)
Auch die Rückgabe von T() verstehe ich nicht.
Was bedeutet das?

In meinen Büchern werden bei der Beschreibung von
Templates nur "normale" einfache Variablen zurückgegeben
in dieser Form:

template <class T> T Max(T x, T y)
{return (x>y) ? x : y;}

Danke für alle Antworten.
 

Lesen sie die antworten

#1 Florian Weimer
27/10/2014 - 12:11 | Warnen spam
* Bernd Meier:

template<typename T> T test::get() const {
return T();
}

1)
Obiges Beispiel habe ich in dieser NG (bzgl. einer anderen Frage) vor
Kurzem gefunden. Was bedeutet hier das const und was àndert
sich, wenn man es weglàßt?



Es bedeutet, daß der this-Zeiger den Typ »const test *« hat, und nicht
»test *«. Dadurch kann die Funktion an mehr Stellen aufgerufen werden,
kann aber selbst weniger Operationen durchführen (eben nur solche, die
wiederum ein »const test *« erwarten).

2)
Ist dieses const vor dem Funktionsrumpf eine Spezialitàt
von templates oder kann es auch bei "normalen" Funktionen
eingesetzt werden?



In C++ geht das bei allen nicht-statischen Funktionen, die Teil der
Klassendefinition sind. Technisch gehört das »const« nicht zum Rumpf,
sondern zur Funktionsdeklaration, d.h. eine Deklaration der Form

template<typename T> T test::get() const;

wàre auch zulàssig.

g++ hatte eine Weile eine Erweiterung, die »const« bei beliebigen
Funktion zuließ (auch außerhalb einer Klassendefinition). Sie ist aber
inzwischen wieder entfernt worden.

3)
Auch die Rückgabe von T() verstehe ich nicht.
Was bedeutet das?



Es wird ein neues Objekt vom Typ T konstruiert, genauso wie man
std::string() schreiben kann, um eine leere Zeichenkette zu erhalten.

Ähnliche fragen