¿Qué está pasando: C++ std:: move on std:: shared_ptr aumenta use_count?
macos shared-ptr (1)
¿Que esta pasando aqui?
En MacOS, parece que debe habilitar explícitamente las semánticas de movimiento con
-std=c++11
(o estándares posteriores) ¹.
De lo contrario, el ejemplo se compila (es decir,
std::shared_ptr
de la implementación de la biblioteca relacionada es utilizable) pero no funciona correctamente ya que las características de idioma requeridas no están habilitadas.
Esto da como resultado que se realicen copias en lugar de construcciones de movimiento.
Hubiera sido mejor si el paquete AppleClang ni siquiera permitiera una instanciación de
std::shared_ptr
cuando las características de idioma requeridas no están habilitadas.
¹) Gracias a @ t.niese por probar el compilador / plataforma dado.
Siempre asumí que
std::move()
en
std::shared_ptr
roba el puntero y establece el puntero del original en
nullptr
-esto no aumenta el recuento de referencias.
Eso no parece ser cierto en mi mundo.
CONFIGURACIÓN
MacOS, g ++ -version => "Apple LLVM versión 10.0.1 (clang-1001.0.46.3)"
CÓDIGO
#include <cstdio>
#include <memory>
class Thing { public: Thing(int N) : value(N) {} int value; };
void print(const char* name, std::shared_ptr<Thing>& sp)
{ printf("%s: { use_count=%i; }/n", name, (int)sp.use_count()); }
int main(int argc, char** argv) {
std::shared_ptr<Thing> x(new Thing(4711));
print("BEFORE x", x);
std::shared_ptr<Thing> y = std::move(x);
y->value = 4712;
print(" AFTER x", x);
print(" AFTER y", y);
return 0;
}
SALIDA
Compilar (
g++ tmp.cpp -o test
) y ejecutar (
./test
), entrega
BEFORE x: { use_count=1; }
AFTER x: { use_count=2; }
AFTER y: { use_count=2; }
Entonces, el recuento de referencia aumenta mientras se usa
std::move()
.
PREGUNTA
¿Que esta pasando aqui?