Является ли `auto x = f()` лучше, чем `T x = f()`?

В другой теме кто-то предложил использовать

auto x = f();

вместо

T x = f();

(если подпись f T f()). Они указали, что это предотвращает нарезку скрытых объектов, если кто-то меняет f на U f(), где U происходит от T.

Для меня это имеет смысл, но в игре могут быть и другие вещи, которые я упускаю. Итак, что лучше и почему?


person ricab    schedule 28.08.2013    source источник
comment
Вы можете прочитать Херба Саттера. GotW #94 (почти всегда автоматически).   -  person syam    schedule 28.08.2013


Ответы (1)


Одно из лучших преимуществ использования auto в этом контексте, как заметил Херб Саттер в Почти всегда автоматически, что auto делает использование API более удобным. То есть API можно модифицировать/рефакторить без каких-либо необходимых изменений в клиентском коде.
Например:

API v1.0

template<typename T>
T* abstract_factory::create();

API v2.0

template<typename T>
std::shared_ptr<T> abstract_factory::create();

Использование (без авто)

 Foo* instance = abstract_factory::create<Foo>();

Клиент обновляет библиотеку API до версии 2.0

 Foo* instance = abstract_factory::create<Foo>(); //TYPE ERROR!!!

Обновить с помощью auto

 auto instance = abstract_factory::create<Foo>(); //OK! type infered to std::shared_ptr<Foo>
person Manu343726    schedule 28.08.2013
comment
Я единственный, кто думает, что API можно модифицировать/рефакторить без каких-либо необходимых изменений в клиентском коде. это плохо? - person R. Martinho Fernandes; 29.08.2013
comment
Если что-то пойдет дальше с необходимостью перекомпиляции, это потому, что новая вещь, которую вы получили от нового API, в любом случае имеет тот же тип утки, и поэтому вам не нужно менять исходный код, если только вы не исходный код зависел от конкретной реализации или типа (чего следует избегать в большинстве случаев). В последнем случае следует указать требуемый тип (например, auto x = TypeINeed(f());). Опубликованная статья Херба Саттера утверждает, что - person ricab; 29.08.2013
comment
Извините, я имел в виду, что если что-то пойдет дальше без необходимости перекомпилировать [...] - person ricab; 29.08.2013