Deklaration von constexpr-Funktionen oder -Methoden

8

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?

Eternal 10.06.2014, 23:24
quelle

1 Antwort

3

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 von e nach den Regeln der abstrakten Maschine (1.9) würde einen der folgenden Ausdrücke auswerten:

     
  • ...
  •   
  • ein Aufruf einer undefinierten constexpr Funktion oder eines undefinierten constexpr 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 und constexpr -Konstruktoren sind implizit inline (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.

    
Jeffrey Yasskin 23.06.2014, 08:34
quelle

Tags und Links