İş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.
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! –