Bjarne Stroustrup opublikował niedawno report w C++ Concepts, w którym wspomniał o czymś, co wydawało mi się zaskakujące. Przykład (w sekcji 7.1) wykorzystuje „skróconym zapisem szablon” i zasadniczo idzie tak:C++ Pojęcia z wieloma argumentami z szablonu
void foo1(auto x,auto y); // x and y may have different types (1)
void foo2(SomeConcept x,SomeConcept y); // x and y must have the same type (2)
Dla mnie osobiście, to wydaje bardzo intuicyjne; w rzeczywistości, oczekiwałbym, że foo2 zaakceptuje wartości x, y różnych typów, o ile odpowiednie typy spełniają SomeConcept. Należy pamiętać, że programista może zawsze jednoznacznie określić jego intencji pisząc jedną z następujących czynności:
template <SomeConcept T> void foo2(T x, T y); // (3)
template <SomeConcept T1,SomeConcept T2> void foo2(T1 x,T2 y); // (4)
Intuicyjnie spodziewałbym skrótowym zapisie z (2) za równoważne (4), a tym samym być bardziej spójne z znaczenie nieskrępowanego szablonu (1). Czy ktoś może rzucić światło na tę sprawę i wyjaśnić racjonalne uzasadnienie dekonstrukcji tego projektu?
Niektóre Uwagi:
- AFAIK, lambda generyczne (C++ 14) pozwalają już składni podobny do (1). Stąd też spójność nakazuje (1) akceptować zmienne wejściowe z różnymi typami, ponieważ generyczne lambdy to robią.
- Stroustrup wymienia klasyczną "parę iteratorów" w kontekście takich szablonów. Uważam jednak, że jest to dość słaby argument, ponieważ (i) jest to tylko jeden przypadek użycia i (ii) aaaik, C++ 17 wprowadza pary (iterator, sentinel), które wymuszają na kodzie generycznym używanie dwóch różnych typów. .
Uzgodniono, że jest to sprzeczne z intuicją. Naprawdę naprawdę chcę * skróconej składni *, o ile pozwala to na różne typy dla tych samych pojęć. –
Należy zauważyć, że dokumenty reprezentują głównie poglądy autora, niekoniecznie od komisji. I myślę, że komitet jest daleki od jednomyślności w kwestii Pojęć (jak widać na podstawie przeszłych mailingów). To, co się ostatecznie wydarzy, pozostanie widoczne; to, czego szukasz, to wnioski komisji, które przeszły. –
Ta sama zasada jest zawarta w aktualnej wersji Concepts TS (§8.3.5, p.22): http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4641 .pdf –