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 WandboxSoweit ich verstehe:
noexcept(magic(dummy2{}))
ruft noexcept(noexcept(adl_caller(...))
, das auf 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%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.
Tags und Links c++ c++11 templates noexcept argument-dependent-lookup