Więc to zapewnia zamierzony wynik:Jeśli przeniesię obiekt lokalny do funkcji, czy będzie on nadal ważny później?
void f(std::string&& s)
{
s += " plus extra";
}
int main(void)
{
std::string str = "A string";
f(std::move(str));
std::cout << str << std::endl;
return 0;
}
Ciąg plusa extra
Oznacza to, że to działa, gdy uruchomię go na Ideone, ale jest to UB? Dodanie dodatkowych inicjalizacji łańcuchów przed i po wywołaniu do f
niczego nie zmieniło.
Tak, nadal będzie ważny, ale zawiera: * niezdefiniowany *. Jedynymi metodami, do których powinieneś wywołać ciąg po * przeniesieniu * z niego, jest zastąpienie jego zawartości czymś nowym. Na przykład 'str.clear();'. – Galik
Powiązane: [Co można zrobić z przeniesionym obiektem?] (Http://stackoverflow.com/q/7027523/3425536) – emlai
Ciąg nie jest przenoszony, referencja rvalue jest wysyłana, a własność nie jest zabrał. Ten kod jest całkowicie poprawny. Nie ma tu udziału UB i nie ma tu żadnej niezdefiniowanej treści _ lub cokolwiek to oznacza. –