İşaretçi ile bir şey yapmaya çalışırsanız ve sonucu sabit bir ifadede kullanırsanız, işaretçi constexpr olarak işaretlenmelidir. Basit bir örnek başvurusu kaldırma işaretçi Aritmetik veya işaretçi olduğu: first
ise Yukarıdaki örnekte
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;
, second
sadece constexpr
olabilir. second
constexpr
olup olmadığını bir işaretçi üzerinden bir constexpr
üye işlevi çağırmak ve sabit ifadesi, çıkan sonuçlara diyoruz işaretçi olarak sonucu kullanmayı denerseniz Benzer *second
sadece sabit bir ifadesi olabilir kendisi gerekir sabit bir ifade
olmak
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
}
yerine
constexpr const S *sp = &s;
sonra yukarıdaki işleri çalışır derseniz. Yukarıdakilerin (yanlış) derlendiğini ve gcc-4.9 ile çalıştığını, ancak gcc-5.1
'u çalıştırdığını unutmayın. Her iki örnekte de "const" işaretçisini yapmamak için hata yaparsınız. Eğer const int * const kullanırsanız, ilk = arr' ve const [const] * const sp 'çalışır. –
@TomaszSodzawiczny bu [yanlış] (http://coliru.stacked-crooked.com/a/321c7fe64b8142ff) –
kontrol ettiğiniz için teşekkürler! G ++ 4.9.2 denedim - ve çalıştı. Ayrıca standardı anladım, bu yüzden daha fazla kontrol etmedim ... Daha fazla bakacağım. –