c++ macos shared-ptr rvalue-reference

¿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?