2015-08-18 4 views
7

Was ist der Unterschied zwischen constexpr int *np = nullptr und int const *np = nullptr?Macht consExpr in Zeigern einen Unterschied

np ist ein konstanter Zeiger auf ein int, das in beiden Fällen null ist. Gibt es eine spezifische Verwendung von constexpr im Zusammenhang mit Zeigern.

Antwort

3

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 secondconstexpr

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

+0

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. –

+0

@TomaszSodzawiczny das ist [falsch] (http://coliru.stacked-crooked.com/a/321c7fe64b8142ff) –

+0

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. –

Verwandte Themen