in dem folgenden Code, ich möchte die use_count()
des shared_ptr
in die std::async
bewegt 1
sein:use_count() von shared_ptr zog in ein std :: async in gcc 4.6.3
#include <memory>
#include <iostream>
#include <future>
using namespace std;
void fun(shared_ptr<int> sp)
{
cout << "fun: sp.use_count() == " << sp.use_count() <<
" (in gcc 4.6.3, is there a way to make this 1?)\n";
}
int main()
{
auto sp1 = make_shared<int>(5);
auto fut = async(
launch::async,
fun,
move(sp1)
);
}
Meine Plattform nutzt gcc 4.6.3 und der Code oben gibt diese Ausgabe (fun: sp.use_count() == 2
):
fun: sp.use_count() == 2 (in gcc 4.6.3, is there a way to make this 1?)
Auf coliru.stacked-crooked.com, erhalte ich das Verhalten, das ich will (fun: sp.use_count() == 1
):
fun: sp.use_count() == 1 (in gcc 4.6.3, is there a way to make this 1?)
Ich bin nicht sicher, was Compiler coliru verwendet, aber ich vermute, es ist neuer als gcc 4.6.3.
Gibt es eine Möglichkeit, um das gewünschte Verhalten zu erhalten, ohne meinen Compiler von gcc 4.6.3 zu aktualisieren?
GCC 4.6 ist mittlerweile sehr alt, und seine Unterstützung für C++ 11 fehlt ziemlich. Wenn du kannst, solltest du upgraden. –
Wenn ich raten müsste, würde ich sagen, dass die Zählung 2 ist, weil Ihr Compiler keine Kopie für das 'sp' Argument zu' fun' macht. Was ist, wenn Sie 'sp1' nicht explizit, sondern nur temporär im async-Aufruf konstruieren? – Darhuuk
hier eine Schätzung, aber was passiert, wenn Sie den Parameterwert stattdessen als R-Wert-Referenz ('&&') ändern? – Default