別のトピックでは、誰かが使用を提案しました
auto x = f();
それ以外の
T x = f();
(の署名が の場合f
) T f()
。f
彼らは、これにより、誰かがたまたま に変更されたU f()
場合にサイレント オブジェクト スライスが防止されると指摘しましU
たT
。
それは私には理にかなっていますが、私が見逃していることが他にもあるかもしれません。では、どちらが優れており、その理由は何ですか?
別のトピックでは、誰かが使用を提案しました
auto x = f();
それ以外の
T x = f();
(の署名が の場合f
) T f()
。f
彼らは、これにより、誰かがたまたま に変更されたU f()
場合にサイレント オブジェクト スライスが防止されると指摘しましU
たT
。
それは私には理にかなっていますが、私が見逃していることが他にもあるかもしれません。では、どちらが優れており、その理由は何ですか?
このコンテキストで使用することの最大のメリットの 1 つは、auto
Herb Sutter が「Almost Always Auto」で気付いたauto
ように、API の使用がより管理しやすくなることです。つまり、クライアント コードに必要な変更を加えることなく、API を変更/リファクタリングできます。
例えば:
template<typename T>
T* abstract_factory::create();
template<typename T>
std::shared_ptr<T> abstract_factory::create();
Foo* instance = abstract_factory::create<Foo>();
Foo* instance = abstract_factory::create<Foo>(); //TYPE ERROR!!!
auto
auto instance = abstract_factory::create<Foo>(); //OK! type infered to std::shared_ptr<Foo>