Ich habe mich gefragt, ob es Einschränkungen gab, wo constexpr-Funktionen und -Methoden deklariert werden müssen, wie es für Inline-Funktionen und -Methoden der Fall ist.
Ich weiß, dass Inline-Funktionen oder Methoden in Header-Dateien geschrieben werden müssen, damit der Compiler auf seine Definition zugreifen kann, wo sie aufgerufen werden. Es würde Sinn machen, wenn es etwas Ähnliches für conexpr gäbe, aber ich kann in diesem Punkt nichts finden ...
Im Grunde genommen sind meine Fragen:
Kann ich die Definitionen von constexpr-Funktionen in eine Header-Datei schreiben, ohne das Risiko eines doppelten Symbols einzugehen?
Kann ich die Deklaration und Definition von constexpr-Funktionen oder Methoden trennen?
Die Stelle, an der Sie eine Funktion constexpr
definieren, beeinflusst, wie Sie sie verwenden können. Insbesondere:
C ++ 14 [expr.const] p2:
Ein Bedingungsausdruck
e
ist ein Kernkonstantenausdruck, es sei denn, die Auswertung vone
nach den Regeln der abstrakten Maschine (1.9) würde einen der folgenden Ausdrücke auswerten:
- ...
- ein Aufruf einer undefinierten
constexpr
Funktion oder eines undefiniertenconstexpr
Konstruktors;
Sie können also keine constexpr
-Funktion in einem konstanten Ausdruck verwenden (Template-Argument, constexpr
Variableninitialisierer, globaler Variableninitialisierer, der statisch ausgewertet werden muss, arraygebundener Ausdruck, vielleicht andere), wenn er nur deklariert wurde aber noch nicht definiert.
Ähnlich, wie dyp kommentierte,
C ++ 14 [dcl.constexpr] p2
...
constexpr
-Funktionen undconstexpr
-Konstruktoren sind implizitinline
(7.1.2).
Das bedeutet die Antwort auf Ihre erste Frage: Die Definition der Funktion constexpr
in einer Kopfzeile führt nicht zu doppelten Symbolen. Wenn Sie eine constexpr-Funktion in einer Kopfzeile deklarieren und sie dann auch nur zur Laufzeit in einer Übersetzungseinheit aufrufen, wird in jeder Übersetzungseinheit, in der sie verwendet wird, eine Inline-Funktion definiert. aus C ++ 14 [basic.def.odr] p4.
Beachten Sie, dass die Regeln für konstante Ausdrücke und Aufrufe im Allgemeinen unterschiedlich sind: Aufrufe erfordern im Allgemeinen die Definition irgendwo in der Übersetzungseinheit: konstante Ausdrücke erfordern die Definition vor der konstante Ausdruck.