Re
” if I replaced the constexpr word with const all above worked correctly."
A const int*
bedeutet im Wesentlichen (const int)*
, mit der Ausnahme, dass Sie nicht verwenden können, Klammern auf diese Weise. A constexpr int*
bedeutet constepxr (int*)
(auch zu beachten).
Dies ist, weil constexpr
nicht Teil des Typs ist, können Sie nicht den Typ constexpr int
, sagen, während const
Teil des Typs ist.
Statt
constexpr int i = 0;
constexpr int& ri = i;
, die eine constexpr
Bezug zu erklären versucht const
nicht, schreiben Sie einfach
constexpr int i = 0;
constexpr int const& ri = i;
Sie können die rückwärts gelesen als ri
ein Verweis auf eine const
int
ist, die ist constexpr
(zur Kompilierzeit ausgewertet).
Nachtrag:
Es ¹appears, dass C++ 14 lokale nicht static
constexpr
Objekte erfordert automatische Speicherdauer, die für die Optimierung as-if Regel Modulo zu haben.
dafür zu sorgen, das heißt den Code portabel zwischen Compiler zu machen, wenn die oben genannten Erklärungen lokal in einer Funktion erscheinen, fügen Sie static
für das Objekt statische Speicherdauer, um sicherzustellen, dass man bezieht sich auf:
void oops()
{
static constexpr int i = 0; // Necessary with some compilers.
constexpr int const& ri = i;
}
Ansonsten kann es nicht mit zb kompilieren g ++, und es ist wahrscheinlich was die C++ 14 und C++ 11 Standards erfordern, durch Weglassen geeigneter Einschränkungen auf constexpr
.
Hinweise:
¹ die discussion of R. Sahu's answer See.
Mögliche doppelte: http://stackoverflow.com/questions/13346879/const-vs-constexpr-on-variables –
Sie vergessen haben, const Qualifier 'constexpr int const & ri = i;'. 'constexpr int i = 0;' deklariere auch 'i' als const ... [demo] (http://melpon.org/wandbox/permlink/2oc2VMdtymZ93ANa) –
Mögliche Duplikate von [const vs conexpr auf Variablen] (http: //stackoverflow.com/questions/13346879/const-vs-contexpr-on-variables) – Swapnil