Это зависит.
Во многих случаях, особенно когда foo()
возвращает тип примитива, ссылка будет оптимизирована, и между обеими версиями не будет никакой разницы.
Но еслиfoo()
возвращает объект большого размера, это может зависеть от того, применимо ли NRVO или нет.
Конструкция auto value = foo();
включает NRVO, а const auto& value = foo();
может иногда предотвращать его ( demo ).Таким образом, нереференсная версия может быть быстрее.
Но если NRVO невозможно из-за способа написания foo()
, временный объект может быть создан и скопирован.Таким образом, ссылочная версия будет быстрее.
Примечание: если возвращаемый объект не может быть создан для копирования, то не ссылочная версия не будет скомпилирована.