c++ - style - shared_ptr example



O que está acontecendo: C++ std:: move std:: shared_ptr aumenta use_count? (1)

Eu sempre estava assumindo que std::move() em um std::shared_ptr rouba o ponteiro e define o ponteiro do original como nullptr - portanto, não aumenta a contagem de referência. Isso não parece ser verdade no meu mundo.

CONFIGURAÇÃO :

MacOS, g ++ -version => "Apple LLVM versão 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;
}

SAÍDA :

Compilar ( g++ tmp.cpp -o test ) e executar ( ./test ), fornece

BEFORE x: { use_count=1; }
 AFTER x: { use_count=2; }
 AFTER y: { use_count=2; }

Portanto, a contagem de referência é aumentada ao usar std::move() .

PERGUNTA :

O que está acontecendo aqui?


O que está acontecendo aqui?

No MacOS, parece que você deve ativar explicitamente a semântica de movimento com -std=c++11 (ou padrões posteriores) ¹. Caso contrário, o exemplo será compilado (por exemplo, std::shared_ptr da implementação da biblioteca relacionada é utilizável), mas não funciona corretamente, pois os recursos de idioma necessários não estão ativados. Isso resulta em cópias reais sendo feitas em vez de mover construções. Seria melhor se o pacote AppleClang nem sequer permitisse uma instanciação de std::shared_ptr quando os recursos de idioma necessários não estiverem ativados.

Thanks) Obrigado a @ t.niese por testar o compilador / plataforma fornecido.





rvalue-reference