Мои экстрасенсорные способности говорят мне, что вы компилируете это на Visual C ++, поэтому это даже работает.В стандартном C ++ вы не можете передать rvalue (то есть значение, возвращаемое makeRandomData
) для ссылки на non-const, поэтому вопрос спорный.
Однако вопрос по-прежнемудействителен, если вы измените подпись mean
на const vector<int>&
.В этом случае все сводится к времени жизни временного объекта, которое определено как последний до конца «полного выражения», в котором оно происходит.В вашем конкретном случае полное выражение - это полный инициализатор results
.В случае оператора выражения, полное выражение - это все выражение.
Стандарт не указывает каким-либо образом, каким образом аргументы функции могут препятствовать RVO, но, конечно, RVO - это мандат, который компилятор должен выполнятьопределенная оптимизация независимо от видимых побочных эффектов, а не требование , чтобы сделать это.Когда (и если) происходит RVO, полностью зависит от используемого вами компилятора.Тем не менее, кажется, нет никаких причин, почему это должно каким-либо образом повлиять на это.