Будут ли возвращаемые значения передаваться по rvalue-ссылке в c ++ 0x? - PullRequest
6 голосов
/ 23 августа 2009

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

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, но я не совсем уверен, что это правда.

Ответы [ 2 ]

7 голосов
/ 23 августа 2009

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

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

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

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

2 голосов
/ 23 августа 2009

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

...