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

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

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

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

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

9
задан Puppy 15 July 2012 в 15:02
поделиться