Как вернуть строку по значению C++ с семантикой перемещения?

Я хочу иметь функцию, которая возвращает строку по значению, и я хочу переместить построить другую строку из этого возвращаемого значения. Когда вызывается 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);
}

0 ответов

Другие вопросы по тегам