Skąd kompilator wie, jak przenosić zmienne lokalne?

Jestem ciekawy, jak działa ta funkcja. Rozważ coś takiego

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

Ten kod kompiluje się dobrze nawet dla typu tylko do przenoszenia, ponieważ kompilator domyślnie go przenosi. Logicznie rzecz biorąc, dla każdego wyrażenia zwrotnego określenie, czy wynik odnosi się do zmiennej lokalnej, rozwiązałoby problem zatrzymania, a jeśli kompilator po prostu potraktowałby wszystkie zmienne lokalne jako wartości w wyrażeniu zwrotnym, to byłoby to problematyczne jako zmienna może być w tym jednym wyrażeniu wielokrotnie określany. Nawet jeśli lokalny miał tylko jedenbezpośredni odniesienia, nie byłbyś w stanie udowodnić, że nie ma innych pośrednich pseudonimów.

Skąd kompilator wie, kiedy przejść z wyrażenia zwrotnego?

questionAnswers(4)

yourAnswerToTheQuestion