Разрешается ли компилятору превращать lvalue в ссылку rvalue, если lvalue больше не используется в своей определяющей области?

Рассмотрим следующее:

ComplexObject foo()
{
    ComplexObject temp;
    //Do things with temp
    ComplexObject result(temp, SOME_OTHER_SETTING); //1
    //Do things with result. Do not use temp at all
    return result; //2
}

ComplexObject foo()
{
    ComplexObject temp;
    //Do things with temp
    ComplexObject result(std::move(temp), SOME_OTHER_SETTING); //1
    //Do things with result. Do not use temp at all
    return std::move(result); //2
}

с предположением, что у ComplexObject есть конструктор перемещения, который намного эффективнее конструктора копирования.

Разрешается ли компилятору эффективно преобразовывать первый код во второй код, поскольку он знает, что ComplexObject нельзя использовать для оставшейся части этого блока?

5
задан Billy ONeal 27 April 2012 в 16:53
поделиться