2014-05-09 32 views
6

Aşağıdaki kodu düşünün? AncakC++ 11 constexpr fonksiyonu geçiş parametresi

constexpr int t1(const int i) 
{ 
    return make_const(i); 
} 

bu değil:


GÜNCELLEME

Ama bu işleri

template<int i> 
constexpr bool do_something(){ 
    return i; 
} 

constexpr int t1(const int i) 
{ 
    return do_something<make_const(i)>(); // error occurs here (i is not a constant expression) 
} 
+1

genel durumda 'I' geçersiz t1 (const int)' in 'constexpr'' değildir Eh çünkü. – stefan

+1

bunu nasıl yapabilirim? – tower120

+0

bunu bir şablon argümanı haline getirmek tek seçeneğinizdir – stefan

cevap

8

A constexpr fonksiyonu ve ilgili bir constexpr değişken, ancak farklı şeyler.

bir constexpr değişken değeri derleme zamanında mevcut olması sağlanır bir değişkendir.

bir constexpr fonksiyonu constexpr bağımsız değişken ile değerlendirildi eğer ve yürütme sırasında "doğru" davranan bir fonksiyonudur, derleme zamanında değerlendirilecektir.

constexprint işlevini constexpr işlevine iletirseniz, derleme zamanında sihirli olarak değerlendirilmeyecektir. Bununla birlikte, giriş parametrelerinin constexpr nansını kendi içinden geçirmesine izin verilir (normal fonksiyonlar bunu yapamaz). fonksiyonlarına

constexpr bunlar derleyici yazılır ve yönergeler ilgili belgeler ve kısıtlama bir karışımıdır.

Bunun sebebi aynı işlevi derleme zamanında hem değerlendirilecek izin vermektir ve çalışma zamanında. Çalışma zamanı argümanlarını geçtiyse, bu bir çalışma zamanı işlevidir. constexpr argümanlarını geçtiyse, derleme zamanında değerlendirilebilir (ve belirli bağlamlarda kullanılıyorsa).

2

t1() Bir constexpr fonksiyonu olmadığından, parametreyi Bir çalışma zamanı değişkeni ...'a geçemezsinizişlevi. Constexpr, parametrenin derleme zamanında bilinmesini bekler.

+0

t1 konsoleksinin yapılması hiçbir şeyi değiştirmez. –

+0

Evet, önerinizi test ediyorum. Aynı eski hikaye. – tower120

+0

@MarcGlisse t1() bir constexpr işlevi olarak doğru bir şekilde oluşturulmamış, bu nedenle sorunu düzeltmek için önerilmiyordum. – paxos1977

6

const ve constexpr arasındaki önemli bir fark, constexpr'un derleme zamanında değerlendirilebilmesidir.

constexpr int ii = make_const(i); yazarak ifadenin derleme zamanında ile değerlendirilen edilecek derleyici anlatıyorsun. i çalışma zamanında değerlendirildiğinden, derleyici bunu yapamaz ve size bir hata verir.