Как компилятор узнает, как перемещать локальные переменные?

Мне любопытно, как именно эта функция работает. Рассмотреть что-то вроде

std::unique_ptr<int> f() { std::unique_ptr<int> lval(nullptr); return lval; }

Этот код прекрасно компилируется даже для типа «только для перемещения», так как компилятор неявно перемещает его. Но логично, что для любого возвращаемого выражения определение того, ссылается ли результат на локальную переменную, будет решением проблемы остановки, и если компилятор просто рассматривает все локальные переменные как значения в возвращаемом выражении, то это будет проблематично, поскольку переменная может упоминаться в этом одном выражении несколько раз. Даже если у местного был только одинdirect Ссылка, вы не сможете доказать, что у него не было других косвенных псевдонимов.

Так как же компилятор узнает, когда нужно перейти от выражения возврата?

Ответы на вопрос(4)

Ваш ответ на вопрос