Будут ли возвращаемые значения передаваться по ссылке rvalue в С++ 0x?

StackOverflow https://stackoverflow.com/questions/1316924

Вопрос

Допустим, у меня есть функция:

typedef std::vector<int> VecType;
VecType randomVector();

int processing()
{
    VecType v = randomVector();
    return std::accumulate(v.begin(), v.end(), 0);
}

Говорит ли C++0x, что ложная копия будет исключена из возвращаемого значения randomVector?Или компилятору потребуется реализовать RVO?Мне кажется, что это значение randomVector() следует рассматривать как значение r, и поэтому следует вызывать конструктор перемещения v, но я не совсем уверен, что это правда.

Это было полезно?

Решение

Правило следующее

  • Если компилятор может выполнить RVO, то ему это разрешено, без копирования и перемещения.
  • В противном случае берется соответствующий конструктор.

Как вы говорите, временное значение является rvalue, и поэтому выбирается конструктор перемещения из-за правила в 13.3.3.2/3, который говорит, что ссылка rvalue привязывается к rvalue лучше, чем ссылка lvalue.Поэтому при принятии решения о том, использовать ли конструктор перемещения или копирования, разрешение перегрузки отдает предпочтение конструктору перемещения.

Правило, согласно которому компилятору разрешено выполнять RVO, написано по адресу 12.8/15.

Другие советы

Все возвращаемые значения считаются rvalues поэтому, если в этом случае компилятор не реализует RVO, он должен использовать конструктор перемещения, а не конструктор копирования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top