2016-10-07 20 views
11

İşlevsel üstbilgi işlevlerini constexpr yapmak için bir teklif üzerinde çalışıyorum. (std::invoke, std::reference_wrapper, std::bind, std::mem_fn, std::not_fn)Constexpr işlev şablonları ne zaman başlatılır?

Ben constexpr fonksiyonları heyecanla örneği çünkü constexpr ekleyerek mevcut kodu kırabilir öğrendim.

template<class T> 
int f(T){ 
    return T::not_existing_member; 
} 

template<class T> 
constexpr int g(T){ 
    return T::not_existing_member; 
} 

int main(){ 
    decltype(f(0)) a; // Well-formed 
    decltype(g(0)) b; // Ill-formed if the function body is instantiated 
} 

GCC bu kodu derler, clang yapmaz. my proposal'da, std::bind örneğini kullanarak aşırı yüklenmelerle istekli bir örneği nasıl işleyebileceğinizi açıklarım.

bir derleyici zorunda kaldığında standardında açıklanır nerede söyle ve izin verildiğinde bir işlev şablonu örneğini miyim? foo değilse

template<class T> 
struct Foo{ 
    constexpr int f(){ 
     return 0; 
    } 

    constexpr int f()const{ 
     return T::not_existing_member; 
    } 
}; 

int main(){ 
    /* constexpr */ Foo<int> foo; 
    foo.f(); // Ill-formed with, Well-formed without constexpr by the standard? 
} 

GCC ve çınlama Hem kod derlemek: Aşağıdaki örnekte GCC ve clang özdeş davranış standardı yürütür veya eğer

Daha doğrusu ben uygulama tanımlı bilmek istiyorum constexpr ve her ikisi de varsa reddedilir.

cevap

6

Örnek # 1 etkin CWG issue 1581. Şu anda doğru davranışının ne olması gerektiğini tam olarak belirtmemiştir. Yön, constexpr örneğinin istekli olması gerektiği gibi görünüyor, ancak bu gelecekte bir noktada açıklığa kavuşturulması gerekiyor.

Örnek 2, basittir: çağıran int Foo<int>::f() const bozuk biçimlidir. Bu, foo nesnesinin const olduğu, ancak const olmayan olduğunda gerçekleşir. Sınıf şablonlarının üye işlevleri yalnızca kullanıldığında görüntülenir ve Foo<int> nesnesiniz const değilse, const üye işlevini hiçbir zaman başlatmaz, böylece kod iyi biçimlendirilmiş olur. constexpr burada alakalı değil.

+0

Ah evet. Örnek 2 hakkında muhakeme yaparken bir hatam vardı. Firmetin “olduğu” nde de “elbette” olur ve dolayısı ile ´const´ aşırı yüklenme doğrudan çağrılır. Çok teşekkür ederim! –

İlgili konular