2016-09-27 2 views
17

Nach this, eine Funktion mit constexpr deklariert werden, müssen einige Anforderungen erfüllen, von denen eine ist wie folgt:constexpr-Funktion muss einen Argumentwert haben?

gibt es mindestens ein Argument Wert, so dass ein Aufruf der Funktion ein ausgewertet werden konnten subexpression eines Kern konstanten Ausdruck ...

Nun, constexpr Funktion keine Argumente haben:

constexpr int Bar(/* empty */) { return 0xFF; } 
constexpr int value = Bar(); // Valid expression 

constexpr Funktion, die als Unterroutine aufgerufen wird, kann den gesamten Ausdruck auch nicht als Kernkonstantenausdruck bestimmen.

Also was bedeutet es von ein Argument Wert muss existieren?

[Update für zukünftige Leser]

Offenbar ist die Beschreibung über die Anforderungen der constexpr function ist seit dieser Frage festgelegt von:

gibt es mindestens ein Argument Wert, so dass ein Der Aufruf der Funktion könnte ein ausgewerteter Unterausdruck eines Kernkonstantenausdrucks sein.

zu:

es mindestens einen Satz von Argument besteht Werte so dass ein Aufruf der Funktion ein ausgewerteter subexpression eines Kern konstanten Ausdruck ...

+3

Ich * denke * es bedeutet, dass * für jedes Argument * gibt es mindestens usw. –

+0

@MartinBonner nein, es bedeutet für alle Argumente als Ganzes –

Antwort

19

Das Zitat von en.cppreference.com in Bezug auf den Standard nicht genau ist, ist das eigentliche Zitat (§ 7.1.5/5):

Für einen constexpr Funktion oder constexpr Konstruktor, der weder notleidenden ist noch eine Vorlage, wenn keine Argumentwerte existieren, so dass ein Aufruf der Funktion oder des Konstruktors ein ausgewerteter Unterausdruck eines Kernkonstantenausdrucks sein könnte (5.20) [...] ist das Programm schlecht ausgebildet; keine Diagnose erforderlich.

Was im Grunde besagt, dass es eine gültige Gruppe von Argumenten (die leere Menge ist in Ihrem Fall eine gültige) existieren muss.

+2

Also, sie vermasselt die Umkehrung der Formulierung. – Yakk

+0

Wenn eine leere Menge auch als gültige Menge betrachtet wird, können wir dann sogar weniger als einen Satz von Argumentwerten haben? (da jede Funktion mindestens eine Menge haben muss, einschließlich einer leeren Menge.) Ich bin nur neugierig, ob das nur eine Formalität ist, um den Standard zu schreiben. –

+1

@DeanSeo Sie können weniger als eine ** gültige ** Menge von Argumenten haben - "constexpr int f (std :: string)" ist nicht gültig, da 'std :: string' nicht' constexpr' sein kann, egal welcher Körper ' f 'könnte sein, es würde niemals eine gültige Menge von Argumenten geben, die den Aufruf von' f 'zu einem konstanten Ausdruck machen würden. – Holt

7

„Ein Argument sein könnte, Wert "bedeutet hier" eine Menge von Argumenten ". Nullfunktionen haben ein mögliches Argument, die leere Menge.

In diesem Fall führt dieser einzelne leere Argumentsatz zu einem gültigen constexpr Aufruf, also ist alles in Ordnung.

Verwandte Themen