Warum müssen wir Funktionen als constexpr kennzeichnen?

C ++ 11 erlaubt Funktionen, die mit dem deklariert wurdenconstexpr Bezeichner, der in konstanten Ausdrücken wie Vorlagenargumenten verwendet werden soll. Es gibt strenge Anforderungen an das, was sein darfconstexpr; Im Wesentlichen kapselt eine solche Funktion nur einen Unterausdruck und nichts anderes. (Edit: Dies ist in C ++ 14 entspannt, aber die Frage steht.)

Warum brauchen Sie das Schlüsselwort überhaupt?Was wird gewonnen?

Es hilft, die Absicht einer Schnittstelle aufzudecken, aber esnicht Bestätigen Sie diese Absicht, indem Sie sicherstellen, dass eine Funktion in konstanten Ausdrücken verwendbar ist. Nach dem Schreiben einesconstexpr Funktion muss ein Programmierer noch:

Schreiben Sie einen Testfall oder stellen Sie auf andere Weise sicher, dass er tatsächlich in einem konstanten Ausdruck verwendet wird.Dokumentieren Sie, welche Parameterwerte in einem konstanten Ausdruckskontext gültig sind.

Entgegen der aufgedeckten Absicht funktioniert das Dekorieren mitconstexpr kann ein falsches Sicherheitsgefühl hinzufügen, da tangentiale syntaktische Einschränkungen überprüft werden, während die zentrale semantische Einschränkung ignoriert wird.

Zusamenfassend: Würde es unerwünschte Auswirkungen auf die Sprache geben, wennconstexpr in funktion deklarationen waren nur fakultativ? Oder würde sich das überhaupt auf ein gültiges Programm auswirken?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage