Мое понимание оптимизации возвращаемого значения заключается в том, что компилятор тайно передает адрес объекта, в котором будет храниться возвращаемое значение, и вносит изменения в этот объект вместо локальной переменной.
Например, код
std::string s = f();
std::string f()
{
std::string x = "hi";
return x;
}
СТАВИТСЯ на
std::string s;
f(s);
void f(std::string& x)
{
x = "hi";
}
При использовании RVO. Это означает, что интерфейс функции изменился, так как есть дополнительный скрытый параметр.
Теперь рассмотрим следующий случай, который я украл из Википедии
std::string f(bool cond)
{
std::string first("first");
std::string second("second");
// the function may return one of two named objects
// depending on its argument. RVO might not be applied
return cond ? first : second;
}
Предположим, что компилятор применит RVO к первому случаю, но не к этому второму случаю. Но не меняется ли интерфейс функции в зависимости от того, применяется ли RVO? Если тело функции f
не видно компилятору, как компилятор знает, было ли применено RVO и должен ли вызывающий объект передать параметр скрытого адреса?