2015-08-18 13 views
7

Qual è la differenza tra constexpr int *np = nullptr e int const *np = nullptr?Constexpr nei puntatori fa la differenza

np è un puntatore costante a un int che è nullo, in entrambi i casi. Esiste un uso specifico di constexpr nel contesto dei puntatori.

risposta

3

Se si tenta di eseguire qualsiasi operazione con il puntatore e si utilizza il risultato in un'espressione costante, il puntatore deve essere contrassegnato come constexpr. L'esempio più semplice è puntatori, o puntatore dereferenziazione:

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; 

Nell'esempio precedente, second può essere solo constexpr se first è. Analogamente *second può essere solo un'espressione costante se second è constexpr

Se si tenta di chiamare una funzione constexpr membro tramite un puntatore e utilizzare il risultato come un'espressione costante, il puntatore si chiama attraverso deve essere essa stessa una costante espressione

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 
} 

Se invece diciamo

constexpr const S *sp = &s; 

quindi quanto sopra opere opere. Si prega di notare che quanto sopra è (erroneamente) compilato ed eseguito con gcc-4.9, ma non gcc-5.1

+0

In entrambi gli esempi si commette l'errore di non rendere il puntatore 'const'. Se usi 'const int * const first = arr' e' const S * const sp' funzionerà. –

+0

@TomaszSodzawiczny che è [errato] (http://coliru.stacked-crooked.com/a/321c7fe64b8142ff) –

+0

grazie per il controllo! Ho provato g ++ 4.9.2 - e ha funzionato. Inoltre ha incontrato la mia comprensione dello standard, quindi non ho controllato ulteriormente ... Ne esaminerò di più. –

Problemi correlati