3 Stimmen

Vorlagenargumentabduktion für Konstantenargument

Angenommen, wir haben

template <typename T>
void foo(T a)
{
    a = 10;
}

int main()
{
    const int a = 5;
    foo(a);
}

Warum wird T als int und nicht als const int abgeleitet, warum kann ich a in der Funktion ändern? Wie funktioniert die Deduktion in diesem Fall?

Hier ist ein funktionierendes Beispiel.

6voto

Joseph Mansfield Punkte 104275

Warum sollte es für die internen Funktionen wichtig sein, dass das Objekt außerhalb der Funktion const ist? Es erhält eine eigene Kopie des Objekts, sodass es selbst entscheiden kann, ob es diese Kopie als const behandeln will oder nicht. Eine Änderung von a innerhalb der Funktion wird das Objekt außerhalb nicht beeinflussen. Das ist der Grund, warum top-Level-cv-Qualifikatoren bei der Typableitung ignoriert werden.

Wenn du möchtest, dass der Parameter const ist, musst du danach fragen.

2voto

iammilind Punkte 64857

Warum wird T als int abgeleitet und nicht als const int, warum sollte ich ein in der Funktion modifizieren können?

Weil du einen Wert übergibst und einen Wert empfängst (nicht als Referenz). Gemäß der Sprachgrammatik würde diese Ableitung immer Vorrang vor const haben.
Zur besseren Verständnis versuche untenstehenden C++11-Code und drucke den typeid aus:

const int a = 5;  // `a` typeid ist `const int`
auto b = a;    // `b` typeid ist `int`

Wie funktioniert die Ableitung in diesem Fall?

Wenn du möchtest, dass a nicht veränderbar ist und die Konstanz des übergebenen Objekts respektiert, dann empfange es per Referenz in der Funktion. d.h.

template
void foo (T& a) 
{
  a = 10; // dies führt zu einem Fehler, wenn `a` eine `const int` ist
}

[Hinweis: Das Übergeben eines Literals würde mit obiger Signatur niemals funktionieren.]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X