Articles of semântica de movimento

Construtor de movimento C ++ 11 não chamado, construtor padrão preferido

Suponha que tenhamos essa class: class X { public: explicit X (char* c) { cout<<"ctor"<<endl; init(c); }; X (X& lv) { cout<<"copy"<<endl; init(lv.c_); }; X (X&& rv) { cout<<"move"<<endl; c_ = rv.c_; rv.c_ = nullptr; }; const char* c() { return c_; }; private: void init(char *c) { c_ = new char[strlen(c)+1]; strcpy(c_, c); }; […]

O que a biblioteca padrão garante sobre a atribuição de movimentação automática?

O que o padrão C ++ 11 diz sobre a atribuição de movimentação automática em relação à biblioteca padrão? Para ser mais concreto, o que, se alguma coisa, é garantido sobre o que o selfAssign faz? template std::vector selfAssign(std::vector v) { v = std::move(v); return v; }

Por que você usa std :: move quando você tem && em C ++ 11?

Duplicar Possível: Alguém pode explicar a semântica de movimento para mim? Recentemente, participei de um seminário em C ++ 11 e o seguinte conselho foi dado. when you have && and you are unsure, you will almost always use std::move Alguém poderia me explicar por que você deveria usar o std::move ao invés de algumas […]

Por que copiamos e depois movemos?

Eu vi o código em algum lugar em que alguém decidiu copiar um object e, em seguida, movê-lo para um membro de dados de uma class. Isso me deixou confuso, pois achei que o objective da mudança era evitar a cópia. Aqui está o exemplo: struct S { S(std::string str) : data(std::move(str)) {} }; Aqui […]

Um vetor movido de sempre está vazio?

Eu sei que geralmente o padrão coloca poucos requisitos sobre os valores que foram movidos de: N3485 17.6.5.15 [lib.types.movedfrom] / 1: Objetos de tipos definidos na biblioteca padrão C ++ podem ser movidos de (12.8). As operações de movimentação podem ser explicitamente especificadas ou implicitamente geradas. A menos que especificado de outra forma, esses objects […]

Reutilizando um contêiner movido?

Qual é a maneira correta de reutilizar um contêiner movido? std::vector container; container.push_back(1); auto container2 = std::move(container); // ver1: Do nothing //container2.clear(); // ver2: “Reset” container = std::vector() // ver3: Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2); Pelo que eu li no rascunho padrão C ++ 0x; ver3 parece ser o caminho correto, […]

Mover-se deixa o object em um estado utilizável?

Digamos que eu tenha dois vetores e eu movo um para o outro, v1 = std::move(v2) ; O v2 ainda estará em um estado utilizável depois disso?

Quais são as regras para a geração automática de operações de movimentação?

Em C ++ 98, o compilador C ++ poderia gerar automaticamente o construtor de cópia e o operador de atribuição de cópia via cópia de membros, por exemplo struct X { std::string s; std::vector v; int n; }; O compilador gera automaticamente o construtor de cópias e o operador de atribuição de cópias para X […]

Qual é a vantagem de usar referências universais em loops baseados em intervalo?

const auto& seria suficiente se eu quiser realizar operações somente leitura. No entanto, eu esbarrei for (auto&& e : v) // v is non-const algumas vezes recentemente. Isso me faz pensar: É possível que, em alguns casos obscuros, haja algum benefício de desempenho ao usar referências universais, em comparação com auto& ou const auto& ? […]

Por que não há designação de movimento / construtor de movimento padrão?

Eu sou um programador simples. As variables ​​de meus alunos, na maioria das vezes, consistem em tipos de POD e contêineres de STL. Por causa disso, raramente tenho que escrever operadores de atribuição ou construtores de cópia, pois eles são implementados por padrão. Adicione a isso, se eu usar std::move em objects não móveis, ele […]