Inkonsistenzen mit bedingten NoExcept- und Overload-Bedingungen

8

Ich habe ein Problem, das das .

Kurz gesagt, ich habe eine Methode magic , die noexcept ist, wenn eine andere Methode noexcept ist.

Das Seltsame ist, dass diese "andere Methode" zwei Überladungen hat und der Compiler wählt die zweite Überladung, um magic noexcept -ness zu bestimmen.

Wenn jedoch magic später aufgerufen wird, wird die erste Überladung aufgerufen, aber die noexcept -ness von magic bleibt gleich!

Hier ist der Link

der Wandbox

Soweit ich verstehe:

  1. noexcept(magic(dummy2{})) ruft
  2. auf
  3. noexcept(noexcept(adl_caller(...)) , das auf
  4. zurückfällt
  5. adl_caller(..., priority_tag<0>) noexcept seit user_method(dummy2) ist dem Compiler zu diesem Zeitpunkt noch nicht bekannt.

Aber wie ist user_method(dummy2) 3 Zeilen oben genannt? Ist das vom Standard beabsichtigt?

Tut mir leid, wenn ich nicht klar genug bin.

%Vor%     
Dante 03.05.2017, 15:29
quelle

1 Antwort

6

[temp.point] / 8 :

  

Eine Spezialisierung für eine Funktionsvorlage [...] kann   mehrere Instanzen von Instanzen innerhalb einer Übersetzungseinheit haben, und   zusätzlich zu den oben beschriebenen Instanziierungspunkten für beliebige   solche Spezialisierung, die einen Punkt der Instanziierung innerhalb der hat   Übersetzungseinheit, das Ende der Übersetzungseinheit wird ebenfalls als a betrachtet   Punkt der Instanziierung. [...] Wenn zwei verschiedene Punkte der Instanziierung   geben Sie eine Vorlage Spezialisierung verschiedene Bedeutungen nach der   Ein-Definition-Regel, das Programm ist schlecht gebildet, keine Diagnose   erforderlich.

Vergleichen Sie [temp.dep.candidate] :

  

Für einen Funktionsaufruf, bei dem postfix-expression abhängig ist   benennen, werden die Kandidatenfunktionen mit den üblichen Suchregeln gefunden   ([basic.lookup.unqual], [basic.lookup.argdep]) außer dass:

     
  • Für den Teil der Suche, der die Suche nach nicht qualifizierten Namen verwendet, werden nur Funktionsdeklarationen aus dem Kontext der Vorlagendefinition gefunden.

  •   
  • Für den Teil der Suche, der verknüpfte Namespaces verwendet ([basic.lookup.argdep]), werden nur Funktionsdeklarationen in beiden gefunden   den Vorlagen-Definitionskontext oder den Vorlagen-Instanziierungskontext   gefunden werden.

  •   

Wenn der Aufruf schlecht formuliert wäre oder eine bessere Übereinstimmung finden würde, hätte die Suche in den zugeordneten Namespaces alle Funktionen berücksichtigt   Deklarationen mit externer Verknüpfung eingeführt in diesen Namespaces in   alle Übersetzungseinheiten, nicht nur die gefundenen Deklarationen   in den Vorlagendefinitions- und Vorlageninstanziierungskontexten dann   Das Programm hat ein undefiniertes Verhalten.

    
T.C. 03.05.2017, 19:26
quelle