2014-04-13 44 views
8

Constexpr özniteliğiyle statik olmayan bir yapının üyesi oluşturma girişimi, bir derleyici hatasıyla sonuçlanır (aşağıya bakın). Neden? Tek bir sabit değer için, sadece struct yapısının yerine program sonlandırılıncaya kadar bu değeri belleğe alacağım mı? Makro kullanmaya dönmeli miyim?Constexpr neden statik olmalı?

struct foo 
{ 
    constexpr int n = 10; 
    // ... 
}; 

error: non-static data member cannot be constexpr; did you intend to make it static? 
+0

Eh, kopyalama çok mantıklı olmaz. – Ben

+1

Statik bellekte bir kereden fazla, yapının her bir örneğinde bir tane daha iyi. – chris

+2

Neden her nesnenin 'constexpr' kopyası var? –

cevap

12

Resmi rasyonel bilmiyorum. Ama kesinlikle karışıklığa yol açabilir. Ben, biri için, statik olmayan bir veri üyesi için constexpr olması ne anlama geldiğini göremiyorum. Aşağıdakileri yapabilir misiniz?

struct foo { 
    constexpr int n = 10; 
    constexpr foo() { } 
    constexpr foo(int n):n(n) { } // overwrite value of n 
}; 

Ya da başlatıcı daima sabit olmalıdır demek, siz (n sabit olmadığından/potansiyel sabit olmayan olabilir) ama

foo f = { 10 }; 
söylemelerine izin yukarıdaki yazmak için izin verilmez yani

constexpr int n kuralı, dolaylı olarak static yerine kötü biçimlendirilmiş bir kuraldır, çünkü semantikleri net olarak IMO olmayacaktır.

+0

Constexpr int n = 10' ile yanlış bir şey göremiyorum, integral bir tür olduğu için derlemenin her kullanımında 'n',' define' durumunda olduğu gibi değeriyle değiştirilmelidir. Sözdizimi oldukça açık, standardın neden izin vermediğini anlamıyorum. –

İlgili konular