den Code Betrachten unter:implizite Konvertierung von Int Shared_ptr
#include <iostream>
#include <memory>
void f(std::shared_ptr<int> sp) {}
template <typename FuncType, typename PtrType>
auto call_f(FuncType f, PtrType p) -> decltype(f(p))
{
return f(p);
}
int main()
{
f(0); // doesn't work for any other int != 0, thanks @Rupesh
// call_f(f, 0); // error, cannot convert int to shared_ptr
}
In der ersten Zeile in main()
, die ganze Zahl 0
wird einem std::shared_ptr<int>
umgewandelt und der Anruf f(0)
gelingt es ohne Probleme. Wenn Sie jedoch eine Vorlage verwenden, um die Funktion aufzurufen, unterscheiden Sie sich davon. Zweite Zeile nicht mehr kompilieren, wobei der Fehler
error: could not convert 'p' from 'int' to 'std::shared_ptr<int>'
Meine Fragen sind:
- Warum der erste Aufruf erfolgreich sein und die zweite nicht? Gibt es etwas, was mir hier fehlt?
- Ich verstehe auch nicht, wie die Umwandlung von
int
zustd::shared_ptr
in dem Aufruff(0)
durchgeführt wird, wie es aussiehtstd::shared_ptr
hat nur explizite Konstruktoren.
PS: Eine Variante dieses Beispiels wird in Scott Meyers' Effective Moderne C++ Punkt 8, als ein Weg des Schützens solche Anrufe mit nullptr
.
@@ vsoftco sollten Sie erwähnen, dass es auch für andere nur für 'f (0)', abgesehen von Null nichts kompiliert, gleiche Fehler arbeitet Werte sogar beim ersten Anruf. –
[This] (http://en.cppreference.com/w/cpp/language/nullptr) deutet auf eine Erklärung hin - "Es gibt implizite Konvertierungen von nullptr in den Nullzeigerwert eines beliebigen Zeigertyps und jeden Zeiger auf den Elementtyp. Ähnliche Konvertierungen gibt es für jeden Wert vom Typ std :: nullptr_t sowie für den Makro NULL, die Null-Zeiger-Konstante. " Aber es wäre interessant zu sehen, dass es mit Standardreferenzen und mehr Klarheit erklärt wird. – Pradhan
@RupeshYadav. erledigt. In der Tat ist es sehr seltsam, sieht aus wie eine Art impliziter Zeiger Umwandlung durchgeführt wird. – vsoftco