Warnung: übergeben von NULL in nicht-Zeiger-argument für " std::thread::thread

Die Funktion, die ich ausführen möchten:

struct foo;
void bar(const foo* p = 0);

Wie ich die Funktion aufrufen:

auto thread = std::thread(&bar, NULL);

Warnung:

foobar.h:223:9: Warnung: übergeben von NULL in nicht-Zeiger-argument 2 of 'std::thread::thread(_Callable&&, _Args&& ...) [mit _Callable = void (*)(const foo*), _Args = {int}]' [-Wconversion-null]

Was vermisse ich hier?

Wenn ich die Funktion aufrufen mit nicht-NULL argument, die Warnung geht Weg.

  • und wenn Sie 0 statt NULL?
  • Sie sollten wirklich mit nullptr statt NULL in C++ >= 11.
  • Im Aufruf? @Wimmel habe ich geändert, der Prototyp, ist nichts passiert.
  • Ich habe zu prüfen, dass @cdhowie, nie benutzt, bevor.
  • nullptr scheint, das Problem zu lösen! Ich habe Hinzugefügt, der Zeiger, nachdem ich gelesen habe, dass stackoverflow.com/questions/13888453/.... Auch, werden Sie sich eine Antwort mit, dass? Wenn ja, möchten Sie vielleicht den link zu dieser Frage: stackoverflow.com/questions/1282295/what-exactly-is-nullptr
  • Die _Args Liste für std::thread hat , int, int für die letzten beiden Parameter. Es sieht für mich wie der compiler verwirrt ist durch die default-Werte oder so etwas.
  • Richtig @molbdnilo, bemerkte ich, dass auch, aber der Prototyp hat Zeiger als die letzten zwei Argumente (ich habe auch die gleiche Warnung für das Letzte argument). Es wäre schön zu wissen, warum dies passiert ist.
  • Nein, _Args ist, die sich durch die Argumente geliefert, um die std::thread Konstruktor, die impliziert, dass was auch immer die NULL makro ausgewertet hat, geben int. Die definition von NULL wird durch die Implementierung festgelegt, so würden wir wissen, wie es definiert ist in OP ' s Fall, zu verstehen, warum es den Typ int. (In der Regel ist es definiert als ((void *)0) im älteren C-code. Offensichtlich hat er eine andere definition hier -- wahrscheinlich nur 0, und 0 implizit konvertierbar jeder Typ Zeiger, aber einige random int - das, was der 0 wird als parameter an std::thread() nicht.)
  • Ah, ja, natürlich. Es war zu offensichtlich, denke ich.
  • Ich sagte: "in älteren C-code". C ist viel entspannter über die Konvertierungen zwischen void * und andere Zeiger-Typen, so dass es dort arbeitet. Würde dies nicht funktionieren, in C++, weil es nicht ermöglichen, eine implizite Konvertierung von void * zu anderen Zeigertypen.
  • Sind Sie wirklich sicher, dass es nicht definiert ist, dass Art und Weise, in neueren C?
  • Ich bekam eine enge Abstimmung, warum? Sollte ich ändern, die Frage für zukünftige Nutzer?
  • Das ist eine der möglichen Definitionen ist aber nicht der einzige.
  • meine Stimme natürlich), Die Frage ist etwas unvollständig, dass Ihre tatsächlichen Aufruf verwendet eine Reihe von undefinierten Variablen. Auch die definition von populate erscheint definieren Sie eine Kostenlose Funktion, die sich nicht auf die member-Funktion &Random_kd_forest::populate. Und schließlich, sollten Sie ein minimal-Beispiel. Dies kann reproduziert werden, mit nur void populate(void*).
  • Ich sehe, ich habe im Hinterkopf, das nächste mal @MSalters! Ich bin sehr verwirrt jetzt auf die Antwort, die ich wählen sollten, scheinen beide einfach gut zu mir!
  • Weil der edit-ich wähle deine Antwort @Deduplicator, um zu brechen die Band. 🙂

InformationsquelleAutor gsamaras | 2015-01-14
Schreibe einen Kommentar