Was ist der abgeleitete Typ eines Constexpr?

8
%Vor%

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:

%Vor%     
themagicalyang 21.10.2016, 12:22
quelle

2 Antworten

1
%Vor%

In diesem Fall wird eine temporäre Variable mit dem Wert 1 an die Funktion foo übergeben, also nicht-const rvalue.

%Vor%

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.

    
Oktalist 21.10.2016, 13:01
quelle
2
  

N3337 [dcl.constexpr]/9: A constexpr Der in einer Objektdeklaration verwendete Spezifizierer deklariert das Objekt als const . [...]

Da Sie k als constexpr deklariert haben, wird es auch als const deklariert, daher wird in Überladungsauflösung const int& ausgewählt.

    
TartanLlama 21.10.2016 12:33
quelle