2015-08-18 19 views

cevap

3

İş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. secondconstexpr

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

+0

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

+0

@TomaszSodzawiczny bu [yanlış] (http://coliru.stacked-crooked.com/a/321c7fe64b8142ff) –

+0

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

İlgili konular