Die Ausgabe ist:
%Vor% Worin wird genau eine constexpr-Variable behandelt?
Die Überladung für foo
ergibt const int&
.
Bearbeiten: Weitergehen mit constexpr als const T&
abgeleitet;
Warum kann ein consExpr im Klassenbereich nicht an eine Funktion weitergegeben werden, die eine universelle Referenz enthält?!
%Vor% Das obige Ergebnis kann nicht kompiliert werden, wenn der Fehler undefined reference to F::k
auftritt.
Das Folgende wird jedoch übergeben:
In diesem Fall wird eine temporäre Variable mit dem Wert 1
an die Funktion foo
übergeben, also nicht-const rvalue.
Hier wird eine benannte const-Variable mit dem Wert 1
an die Funktion foo
übergeben, also const lvalue. Das static
-Schlüsselwort hat keine Auswirkung auf eine constexpr
-Variable im Funktionsumfang.
Was genau wird eine constexpr-Variable als behandelt?
Bei Verwendung in einem Ausdruck, der kein konstanter Ausdruck ist, ist eine Variable constexpr
nur eine Variable const
.
Warum kann ein consExpr im Klassenbereich nicht an eine Funktion übergeben werden, die eine universelle Referenz enthält?!
Sie erhalten einen Linkerfehler, weil Sie die Variable verwendet oder nicht definiert haben. Sie benötigen eine Definition von F::k
im Namespace-Bereich in genau einer Übersetzungseinheit, genau wie Sie es für static const
-Membervariablen in C ++ 98 getan haben.
N3337 [dcl.constexpr]/9:
Aconstexpr
Der in einer Objektdeklaration verwendete Spezifizierer deklariert das Objekt alsconst
. [...]
Da Sie k
als constexpr
deklariert haben, wird es auch als const
deklariert, daher wird in Überladungsauflösung const int&
ausgewählt.
Tags und Links c++ c++11 templates constexpr overloading