2017-02-23 18 views
19

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. .
+5

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

+0

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

+0

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 –

Odpowiedz

2

Najwcześniejszym papier mogę stwierdzić, że wymienia zwięzłą składni w kontekście obecnego wniosku Pojęcia jest N3580, który w §6.2.2 zapewnia ten Uzasadnienie:

Co jeśli potrzebujemy dwóch argumentów rodzaje tej samej koncepcji? Rozważmy

void sort(Ran p, Ran q); 

aby to sensu, p i q muszą być tego samego typu, a to regułą. Domyślnie, jeśli używasz tej samej nazwy ograniczonego parametru dla dwóch argumentów, typy tych argumentów muszą być takie same. Zdecydowaliśmy się na wielokrotne użycie nazwy ograniczonego parametru, co oznacza "ten sam typ", ponieważ (w większości środowisk) jest to najczęstszy przypadek, a celem jest zoptymalizowanie do najprostszego przypadku zapisu zwięzłego. Ponadto ograniczonym parametrem jest nazwa typu, a posiadanie dwóch nazw typów odnosi się do różnych typów w tym samym zakresie, co spowodowałoby chaos.

Tony van Eerd i Boton Ballo mają propozycję zmiany tego znaczenia: P0464. W artykule przedstawiono dwa argumenty na poparcie dotychczasowych znaczeń, jeden podobny do jednego Sutton i wsp zrobić i jeden prostopadły:

częstotliwość korzystania
można stwierdzić, że nie często chcą funkcja, która przyjmuje dwa argumenty o potencjalnie różnych typach spełniających tę samą koncepcję bez konieczności posiadania dodatkowej relacji między tymi dwoma typami.

Interakcje z definicji sprawdzania
Można również uznać, że ta zmiana będzie zachęcać szablonów autorom pisać pod ograniczonej szablonów, ponieważ będą one zdecydować się na stosowanie lakoniczny R foo(ConceptName, ConceptName); formę nawet w przypadkach, gdy w nie powinno być dodatkowe ograniczenie typów parametrów. Proliferacja nieskrępowanych szablonów sprawi, że wprowadzenie definicji będzie trudniejsze, ponieważ nieskrępowany szablon nie przejdzie sprawdzania definicji.


nie jestem zaznajomiony z jakiegokolwiek innego argumentu na rzecz obecnego składni, ale jeśli są, nie krępuj się napisz do Tony i Botond do włączenia do swojej pracy.

+0

Dziękuję za odpowiedź. Właściwie znalazłem propozycję Botonda chwilę po moim pierwotnym pytaniu i mam nadzieję, że zyska ona poparcie komitetu. Dla mnie osobiście głównym argumentem jest spójność ze składnią "auto", ale wydaje się, że Botond już to stwierdza w swojej propozycji. –

Powiązane problemy