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
fonte
2015-08-18 06:18:48
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à. –
@TomaszSodzawiczny che è [errato] (http://coliru.stacked-crooked.com/a/321c7fe64b8142ff) –
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ù. –