Heim >Backend-Entwicklung >C++ >Was bestimmt, ob ein C 11-Template-Ersetzungsfehler ein harter oder weicher Fehler ist?

Was bestimmt, ob ein C 11-Template-Ersetzungsfehler ein harter oder weicher Fehler ist?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-18 19:03:11341Durchsuche

What Determines Whether a C  11 Template Substitution Error Is a Hard or Soft Error?

Unmittelbarer Kontext bei der C 11-Vorlagensubstitution

Der C 11-Standard führt Substitution Failure Is Not An Error (SFINAE) ein, das dies ermöglicht Unterdrückung harter Kompilierungsfehler während der Ersetzung von Vorlagenargumenten. Der Standard definiert jedoch einen spezifischen „unmittelbaren Kontext“, für den SFINAE gilt, was eine gewisse Unsicherheit darüber lässt, wann ein Substitutionsfehler zu einem harten oder weichen Fehler führt.

Unmittelbare Kontextdefinition

Der Standard definiert den unmittelbaren Kontext als:

"Nur ungültige Typen und Ausdrücke im unmittelbaren Kontext des Funktionstyps und seiner Vorlagenparametertypen können zu einem Abzugsfehler führen ... Solche Nebenwirkungen stehen nicht im „unmittelbaren Kontext“ und können dazu führen, dass das Programm fehlerhaft ist.“

Entscheidung Verfahren

Um festzustellen, ob ein Ersetzungsfehler im unmittelbaren Kontext auftritt, berücksichtigen Sie das folgende Entscheidungsverfahren:

Schritt 1:

Identifizieren Sie alle Vorlagen und implizit definierte Funktionen, die erforderlich sind, um das Ergebnis der Substitution zu bestimmen.
  • Schritt 2: Stellen Sie sich vor Diese Entitäten werden generiert, bevor die Substitution beginnt.
  • Schritt 3: Wenn während dieser hypothetischen Generierung Fehler auftreten, stehen sie nicht im unmittelbaren Kontext und führen zu harten Fehlern.
  • Schritt 4: Wenn alle Entitäten fehlerfrei generiert werden, sind alle nachfolgenden Fehler während der Ersetzung keine Fehler, sondern führen zu einem Argumentabzug Fehler.
  • Beispiele

Schwerer Fehler:

func> - Instanziierung von A schlägt fehl, weil Zeiger auf Referenzen nicht zulässig sind.
  • Fehler beim Argumentabzug: func> - Instanziierung von A Erfolgreich, aber A::type existiert nicht.
  • Fehler bei der Argumentableitung: class B { void f(int); }; func::f – Die implizite Definition von f ergibt eine gelöschte Mitgliedsfunktion.
  • Fazit

Durch das Verständnis des Konzepts des unmittelbaren Kontexts und die Verwendung der Mithilfe des oben beschriebenen Entscheidungsverfahrens können Programmierer besser vorhersagen, wann Substitutionsfehler zu harten oder weichen Fehlern führen, was eine effektivere Nutzung von SFINAE in C 11 ermöglicht Vorlagen.

Das obige ist der detaillierte Inhalt vonWas bestimmt, ob ein C 11-Template-Ersetzungsfehler ein harter oder weicher Fehler ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn