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ę.

questionAnswers(1)

yourAnswerToTheQuestion