Kötü biçimlendirilmiş varsayılan şablon parametrelerine sahip kullanılmayan üye şablonları için bir tanılama gerekli midir?
Aşağıdaki sınıf şablonunu düşünün:
template<typename T>
struct S
{
template<auto = T()>
void f();
};
Kötü biçimlendirilmiş S
şablon parametreleriyle somutlaştırmak T
için auto = T()
kötü biçimlendirilmiş mi?
int main()
{
S<int> a; // ok
S<int&> b; // error
S<int()> c; // gcc ok, clang error
}
Durum böyle görünüyor, ancak sorun c
, nerede S
bir işlev türü ile somutlaştırıldığıyla ilgili. gcc bunda sorun yok, clang diyor ki:
error: cannot create object of function type 'int ()'
bu mantıklı. Gcc somutlaştırmayı tanıladığından int&
, bunun bir gcc hatası olduğundan şüpheleniyorum. Bu doğru mu yoksa bu kod için teşhis gerekli değil mi?
Yanıtlar
Bu CWG1635 :
1635. Şablon varsayılan bağımsız değişkenleri, varsayılan bağımsız değişkenlere ne kadar benzer?
Varsayılan işlev bağımsız değişkenleri yalnızca ihtiyaç duyulduğunda somutlaştırılır. Aynı şey varsayılan şablon bağımsız değişkenleri için de geçerli mi? Örneğin, aşağıdakiler iyi biçimlendirilmiş mi?
#include <type_traits> template<class T> struct X { template<class U = typename T::type> static void foo(int){} static void foo(...){} }; int main(){ X<std::enable_if<false>>::foo(0); }
Ayrıca, arama üzerindeki etki aynı mı? Örneğin,
struct S { template<typename T = U> void f(); struct U {}; };