Wenn Sie versuchen, irgendetwas mit dem Zeiger zu tun und das Ergebnis in einem konstanten Ausdruck zu verwenden, dann muss der Zeiger als conexpr markiert werden. Das einfache Beispiel Zeigerarithmetik ist, oder Zeiger Dereferenzierung:
static constexpr int arr[] = {1,2,3,4,5,6};
constexpr const int *first = arr;
constexpr const int *second = first + 1; // would fail if first wasn't constexpr
constexpr int i = *second;
Im obigen Beispiel kann second
nur sein constexpr
wenn first
ist. Ebenso kann *second
nur ein konstanter Ausdruck sein, wenn second
constexpr
ist Wenn Sie versuchen, eine constexpr
Member-Funktion über einen Zeiger zu rufen und das Ergebnis als einen konstanten Ausdruck verwenden, den Zeiger Sie es durch muss sich ein konstanter Ausdruck sein nennen
struct S {
constexpr int f() const { return 1; }
};
int main() {
static constexpr S s{};
const S *sp = &s;
constexpr int i = sp->f(); // error: sp not a constant expression
}
Wenn wir stattdessen sagen
constexpr const S *sp = &s;
dann die oben genannten Arbeiten funktioniert. Bitte beachten Sie, dass das obige (nicht korrekt) kompiliert und läuft mit gcc-4.9, aber nicht gcc-5.1
In beiden Beispielen machen Sie den Fehler, den Zeiger 'const' nicht zu machen. Wenn Sie 'const int * const first = arr' und' const S * const sp' verwenden, wird es funktionieren. –
@TomaszSodzawiczny das ist [falsch] (http://coliru.stacked-crooked.com/a/321c7fe64b8142ff) –
danke für die Überprüfung! Ich habe g ++ 4.9.2 probiert - und es hat funktioniert. Auch hat es mein Verständnis des Standards getroffen, so hat weiter ... nicht nachgecheckt ... Ich werde mich mehr damit befassen. –