Pytania hipotetyczne, dawniej-C ++ 0x
(Preambuła: Jestem późnym zwolennikiem gry C ++ 0x, a niedawne kontrowersje dotyczące usunięcia pojęć ze standardu C ++ 0x zmotywowały mnie do poznania ich. Rozumiem, że wszystkie moje pytania są całkowicie hipotetyczne - o ile koncepcje nie będą ważne dla kodu C ++ przez jakiś czas, jeśli w ogóle - nadal jestem zainteresowany poznaniem pojęć, zwłaszcza biorąc pod uwagę, jak to pomoże rozumiem pełniej zalety niedawnej decyzji i kontrowersji, które nastąpiły)
Po przeczytaniu jakiegoś wstępnego materiału na temat pojęć, takich jak C ++ 0x (do niedawna) zaproponował je, mam problem z opakowaniem mojego umysłu w niektóre kwestie składniowe. Bez dalszych wątpliwości, oto moje pytania:
1) Czy typ, który obsługuje konkretną koncepcję pochodną (domyślnie, za pomocą słowa kluczowego auto lub jawnie za pośrednictwem concept_maps) również musi obsługiwać koncepcję bazową niezależnie? Innymi słowy, robi akt wyprowadzenia pojęcia z innego (np.concept B<typename T> : A<T>
) domyślnie zawiera „niewidzialny” wymaga oświadczenia (w obrębie B,requires A<T>;
)? Zamieszanie wynika ze strony Wikipedii dotyczącej pojęć, które mówią:
Podobnie jak w przypadku dziedziczenia klas, typy spełniające wymagania koncepcji pochodnej również spełniają wymagania koncepcji bazowej.
Wydaje się, że typ musi spełniać wymagania pochodnej koncepcji, a niekoniecznie wymagania koncepcji bazowej, co nie ma dla mnie sensu. Rozumiem, że Wikipedia jest daleka od ostatecznego źródła; Czy powyższy opis jest tylko złym wyborem słów?
2) Czy pojęcie, które wyświetla nazwy typów, może być „automatyczne”? Jeśli tak, w jaki sposób kompilator automatycznie mapuje te nazwy typów? Jeśli nie, czy istnieją inne okazje, w których niewłaściwe byłoby użycie „auto” w koncepcji?
Aby wyjaśnić, rozważ następujący hipotetyczny kod:
template<typename Type>
class Dummy {};
class Dummy2 { public: typedef int Type; };
auto concept SomeType<typename T>
{
typename Type;
}
template<typename T> requires SomeType<T>
void function(T t)
{}
int main()
{
function(Dummy<int>()); //would this match SomeType?
function(Dummy2()); //how about this?
return 0;
}
Czy któraś z tych klas pasuje do SomeType? Lub czy concept_map jest niezbędny dla pojęć związanych z nazwami?
3) Wreszcie trudno mi zrozumieć, co aksjomaty mogłyby zdefiniować. Na przykład, czy mogę mieć pojęcie definiujące aksjomat, który jest logicznie niespójny, taki jak
concept SomeConcept<typename T>
{
T operator*(T&, int);
axiom Inconsistency(T a)
{
a * 1 == a * 2;
}
}
Co by to zrobiło? Czy to jest nawet ważne?
Doceniam, że jest to bardzo długi zestaw pytań, więc z góry dziękuję.