Я хочу иметь функцию, которая возвращает строку по значению, и я хочу переместить построить другую строку из этого возвращаемого значения. Когда вызывается NRVO / RVO, конструктор перемещения работает нормально, копия не создается, но когда я не могу положиться на NRVO, функция создает копию строки, даже когда я явно перемещаю возвращаемое значение.
Я печатаю значения адреса необработанных данных, чтобы проверить, была ли сделана копия.
Вот код:
void printStringAdr(const std::string& s)
{
std::cout << (void*)s.data() << std::endl;
}
std::string getStringNRVO()
{
std::string str("text");
printStringAdr(str);
return str; //works fine, no copy
}
std::string getStringNoNRVO()
{
std::string str1("ABC");
std::string str2("XYZ");
if (rand() % 2)
{
printStringAdr(str1);
return str1; //makes copy
}
else
{
printStringAdr(str2);
return str2; //makes copy
}
}
std::string getStringNoNRVO_ForceMove()
{
std::string str1("ABC");
std::string str2("XYZ");
std::string* strptr = &str1;
if (rand() % 2)
strptr = &str2;
printStringAdr(*strptr);
return std::move(*strptr); //doesn't work, makes copy
}int main()
{
std::string s = getStringNRVO(); //only this function works like i expect
printStringAdr(s);
}
Задача ещё не решена.
Других решений пока нет …