c++11 std::move

0
std::string&& greetings1()
{
	return std::move(std::string("Hello, World!"));
}
std::string greetings2()
{
	return std::move(std::string("Hello, World!"));
}

Czy jest jakaś róznica pomiedzy tymi funkcjami? Czy to dobry pomysł zwrócić duzą zmienną lokalną(!przykład) przez move, żeby wykorzystać ją przez "chwile" i nie kopiować?

2

Obie te rzeczy są niepoprawne.

W 1. zwracasz referencję do lokalnego obiektu. To prędzej czy później spowoduje undefined behavior i jest ogólnie błędem.
W 2. powodujesz, że copy elision (return value optimizationw tym przypadku) nie zadziała. Taki kod nie ma większego sensu. W "zwykłym" return tak czy siak zostanie użyte move semantics jeżeli jest dostępne, a dodatkowo może właśnie zajść wspomniana optymalizacja.

Używaj zwykłego return.

0

Pierwsza funkcja zwraca referencję do lokalnego obiektu, co spowoduje niepoprawne działanie lub wykrzaczenie się programu.
Druga funkcja nie powinna korzystać z std::move. Standard gwarantuje, że przy zwracaniu wartości, której kopia mogłaby być pominięta (copy elision), ma być wywołany move constructor.
Wszystko się sprowadza do tego, czy kompilator zauważy, że może pominąć kopię, co std::move w tym przypadku może wręcz utrudnić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1