Frage

( Präambel: Ich bin ein Spät Folger zur C ++ 0x-Spiel und die jüngsten Kontroverse über die Beseitigung von Konzepten aus dem C ++ 0x-Standard motiviert hat mich mehr über sie zu erfahren. während ich, dass alle meine Fragen verstehe völlig hypothetisch sind - soweit Konzepte nicht gültig C ++ Code für einige Zeit zu kommen, wenn überhaupt - ich bin immer noch daran interessiert, mehr über Konzepte zu lernen, vor allem da, wie es helfen würde, verstehe ich mehr in vollem Umfang die Vorteile hinter der jüngsten Entscheidung und die Kontroversen, die danach folgen)

Nach einigen einleitenden Materialien auf Konzepte wie C ++ 0x gelesen zu haben (bis vor kurzem) vorgeschlagen, sie, ich habe Probleme beim Einwickeln meiner Meinung nach um einigen syntaktischen Fragen. Ohne weitere Umschweife, hier sind meine Fragen:

1) Würde ein Typ, der einen bestimmten abgeleitete Begriff (entweder implizit indepdendently, über das Schlüsselwort auto oder explizit über concept_maps) auch unterstützen muß das Basiskonzept unterstützt? Mit anderen Worten, der Akt der ein Konzept aus einem anderen abzuleiten (z concept B<typename T> : A<T>) implizit eine ‚unsichtbare‘ erfordert Aussage (innerhalb B, requires A<T>;)? Die Verwirrung entsteht aus der Wikipedia-Seite über Konzepte, die besagt:

  

Wie in Klassenvererbung, Typen,   erfüllen die Anforderungen der abgeleiteten   Konzept erfüllt auch die Anforderungen des   das Grundkonzept.

Das scheint zu sagen, dass ein Typ nur das abgeleitete Konzepts der Anforderungen gerecht zu werden braucht und nicht unbedingt das Anforderungen des Grundkonzeptes, das für mich keinen Sinn macht. Ich verstehe, dass Wikipedia weit von einer endgültigen Quelle ist; die obige Beschreibung ist nur eine schlechte Wahl der Worte?

2) Kann ein Konzept, das 'auto' typenames sein auflistet? Wenn ja, wie würde Karte der Compiler diese typenames automatisch? Wenn nicht, gibt es andere Gelegenheiten, bei denen es ungültig wären, auf einem Konzept ‚auto‘ zu benutzen?

Um zu klären, betrachten Sie das folgende hypothetische Code:

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;
}

Würde eine dieser beiden Klassen entsprechen Sometype? Oder ist ein concept_map notwendig für Konzepte beteiligt typenames?

3) Schließlich ich habe eine harte Zeit zu verstehen, welche Axiome erlaubt wäre zu definieren. Zum Beispiel könnte ich habe ein Konzept, ein Axiom definieren, die logisch inkonsistent, wie

ist
concept SomeConcept<typename T>
{
    T operator*(T&, int);

    axiom Inconsistency(T a)
    {
         a * 1 == a * 2;
    }
} 

Was würde das tun? Ist das überhaupt gültig?

Ich schätze, dass dies eine sehr lange Reihe von Fragen und so im Voraus danke ich Ihnen.

War es hilfreich?

Lösung

Ich habe den neuesten C ++ 0x Entwurf verwendet, N2914 als Referenz für die folgende Antwort (die noch Konzepte Formulierung hat).

1) Konzepte sind wie Schnittstellen in diesem. Wenn Ihr Typ ein Konzept unterstützt, soll es auch alle „Basis“ Konzepte unterstützen. Wikipedia Aussage, die Sie zitieren, macht Sinn aus der Sicht eines Kunden-Typ - wenn er das T erfüllt Konzept Derived<T> kennt, dann weiß er auch, dass es Konzept Base<T> erfüllt. Autor Perspektive von Art, dies bedeutet natürlich, dass beide umgesetzt werden müssen. Siehe 14.10.3 / 2.

2) Ja, ein Konzept mit typename Mitgliedern auto werden kann. Solche Mitglieder automatisch abgeleitet werden können, wenn sie in den Definitionen der Funktionselemente in dem gleichen Konzept verwendet werden. Zum Beispiel value_type für Iterator kann als Rückgabetyp seiner operator* abgeleitet werden. wenn ein Typ Element verwendet wird nicht überall jedoch wird es nicht abgeleitet werden, und somit wird nicht implizit definiert werden. In Ihrem Beispiel gibt es keine Möglichkeit SomeType<T>::Type für entweder Dummy oder Dummy1 ableiten, wie Type nicht von anderen Mitgliedern des Begriffs verwendet wird, so wird weder Klasse auf das Konzept der Karte (und in der Tat, keine Klasse könnte möglicherweise auto-Karte es). Siehe 14.10.1.2/11 und 14.10.2.2/4.

3) Axiome waren ein Schwachpunkt der Spezifikation, und sie werden immer wieder wurden einige (mehr) Sinn machen aktualisiert. Kurz vor Konzepte aus dem Entwurf herausgezogen wurden, gab es eine Papier , die ziemlich verändert - lesen Sie es und sehen, ob es mehr Sinn für Sie, oder Sie noch Fragen zu ihm macht

.

Für Ihr spezielles Beispiel (für syntaktischen Unterschied Buchhaltung), wäre es, dass die Compiler bedeuten würde erlaubt seinen Ausdruck (a*1) zu betrachten die gleichen wie (a*2) sein, für die Zwecke des „As-if“ -Regel der Sprache (dh des Compiler erlaubt keine Optimierungen zu tun, es will, so lange, wie das Ergebnis verhält als ob es gab keine). Allerdings ist der Compiler in irgendeiner Weise nicht erforderlich, um die Richtigkeit der Axiome zu validieren (daher, warum sie Axiome genannt werden!) -. Es braucht sie nur für das, was sie sind

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top