Alguns esclarecimentos sobre referências de valor

Primeiro: onde estãostd::move estd::forward definiram? Sei o que eles fazem, mas não consigo encontrar provas de que seja necessário qualquer cabeçalho padrão para incluí-los. Às vezes em gcc44std::move está disponível e, às vezes, não, portanto, uma diretiva de inclusão definitiva seria útil.

Ao implementar a semântica de movimentação, presumivelmente a fonte é deixada em um estado indefinido. Esse estado deve necessariamente ser um estado válido para o objeto? Obviamente, você precisa chamar o destruidor do objeto e atribuir a ele por qualquer meio que a classe expor. Mas outras operações devem ser válidas? Suponho que estou perguntando, se sua classe garante certos invariantes, você deve se esforçar para aplicá-los quando o usuário disser que não se importa mais com eles?

Próximo: quando você não se importa com a semântica de movimentação, existem limitações que podem fazer com que uma referência não-const seja preferida a uma referência rvalue ao lidar com parâmetros de função?void function(T&); sobrevoid function(T&&); Do ponto de vista de um chamador, ser capaz de passar valores temporários às funções é ocasionalmente útil, portanto parece que se deve conceder essa opção sempre que possível. E as referências rvalue são elas próprias lvalues, portanto você não pode inadvertidamente chamar um construtor de movimento em vez de um construtor de cópia, ou algo assim. Não vejo uma desvantagem, mas tenho certeza de que há uma.

O que me leva à minha pergunta final. Você ainda não pode vincular temporários a referências não constantes. Mas você pode vinculá-los a referências não constantes do valor. E você pode passar essa referência como uma referência não-const em outra função.

void function1(int& r) { r++; }
void function2(int&& r) { function1(r); }
int main() { 
    function1(5); //bad
    function2(5); //good
}

Além do fato de não fazer nada, há algo errado com esse código? Meu intestino diz, é claro que não, uma vez que alterar as referências de valor é o ponto principal da existência deles. E se o valor passado for legitimamente constante, o compilador o capturará e gritará com você. Mas, ao que parece, essa é uma maneira geral de um mecanismo que foi supostamente criado por um motivo, então eu gostaria de confirmar que não estou fazendo nada tolo.

questionAnswers(3)

yourAnswerToTheQuestion