Was ist der Grund für ADL für Argumente, deren Typ eine Klassenvorlagenspezialisierung ist?

8

Ich habe einige Zeit damit verbracht herauszufinden, warum mein Code nicht kompiliert wird, und ich habe festgestellt, dass in C ++ Argumentabhängige Suche Vorlagennamen-Argumente verwendet, um den Namen-Lookup-Bereich zu bestimmen.

%Vor%

Also kompiliert der ehemalige Verweisaufruf, weil für myns::X<int> nur myns::ref berücksichtigt wird, während letzterer nicht kompiliert wird, weil er myns::ref() sowie std::ref

findet

Meine Frage ist wie kann das nützlich sein? Warum sollte ich das brauchen? Hast du irgendwelche Ideen, Beispiele? Im Moment sehe ich nur Nachteile wie im obigen Beispiel, wo es unnötige Zweideutigkeiten hervorruft.

    
witosx 19.04.2017, 10:21
quelle

2 Antworten

7

Angenommen, Sie fügen alle Dinge in Ihren eigenen Namespace ein, einschließlich einer benutzerdefinierten Klasse und einer Funktion, die std::vector als Parameter akzeptiert. d. h.

%Vor%

Dann können Sie die Tatsache ausnutzen, dass ADL auch die Typen berücksichtigt, die als Template-Argumente zur Verfügung gestellt werden schreib einfach:

%Vor%

andererseits:

%Vor%

Gehen Sie zurück zu Ihrer ursprünglichen Frage, die Lektion hier ist, verwenden Sie keine Namen aus Standard-Bibliotheken, es macht nur Codes verwirrend.

    
songyuanyao 19.04.2017, 10:36
quelle
3

In einem Wort: Wiederverwendung. Es ermöglicht Ihnen, nützliche Komponenten aus anderen Bibliotheken zu verwenden und weiterhin ADL angewendet zu haben.

Zum Beispiel:

%Vor%

Nun können Sie natürlich Code schreiben, wie Sie es direkt mit der Klasse tun würden:

%Vor%

Wenn dies nicht der Fall ist, müssen Sie Ihren eigenen Smart Pointer in Ihrem eigenen Namespace implementieren, um gute Codierungs-Idiome und ADL zu ermöglichen.

    
StoryTeller 19.04.2017 10:42
quelle