Hier ein Beispiel:Argument-dependent Nachschlag und Funktionsschablonen
#include <string>
#include <algorithm>
#include <memory>
using std::string;
int main()
{
string str = "This is a string";
// ok: needn't using declaration, ADL works
auto it = find(str.begin(), str.end(), 'i');
// error: why ADL doesn't work?
std::shared_ptr<string> sp = make_shared<string>(str);
}
Wenn ich dieses Programm zu kompilieren versucht, der Compiler beschwert:
error: no template named 'make_shared'; did you mean 'std::make_shared'?
std::shared_ptr<string> sp = make_shared<string>(str); // error...
^~~~~~~~~~~
std::make_shared
Ich denke, die erste Funktion find
nicht benötigt using
Deklaration wegen argumentabhängiger Suche (ADL
): der Compiler würde den Namespace suchen, in dem sich string
befindet (dh std
) für die Definition von find
. Aber für die zweite Funktion make_shared
scheint es, dass ADL
nicht funktioniert: Ich muss stattdessen std::make_shared
oder using
Erklärung verwenden. Ich weiß, dass die Definitionen von zwei Funktionsschablonen unterschiedlich sind: der ehemalige nimmt einen seiner Schablonenparameter (typename T
oder etwas Ähnliches) als Funktionsparametertyp und gibt den gleichen Typ zurück. Letzterer übernimmt das Funktionsparameterpaket als Funktionsparameter und sein Rückgabetyp ist ein weiterer Vorlagenparameter. Ist dieser Unterschied, der ADL
deaktiviert? Oder könnten Sie die Frage beantworten und Referenzen geben?
Die erste Verwendung ist spröde. Sie verlassen sich auf den unbestimmten Umstand, dass der Iteratortyp in 'std' lebt. Wenn an einem anderen Tag der Iteratortyp "const char *" ist, wird er nicht kompiliert. –
Ich weiß, dass es eine brüchige Art ist, die 'using' Deklaration wegzulassen. Genau wie ein Vergleich mit dem zweiten> _ <|||. – chihyang
@chihyang: Besseres Beispiel wäre 'begin (str)'. – Jarod42