Будут ли возвращаемые значения передаваться по ссылке rvalue в С++ 0x?
-
19-09-2019 - |
Вопрос
Допустим, у меня есть функция:
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, он должен использовать конструктор перемещения, а не конструктор копирования.