1. ホーム
  2. c++

[解決済み】C++11のautoキーワードはどこまでがやりすぎ?

2022-04-03 09:09:08

質問

私はこれまで、新しい auto キーワードは、C++11 標準で、複雑なテンプレート化された型のために設計されたと思います。しかし、私はこのキーワードを次のようなことにも使っています。

auto foo = std::make_shared<Foo>();

そして、より懐疑的に向けて。

auto foo = bla(); // where bla() return a shared_ptr<Foo>

このテーマに関する議論はあまり見たことがありません。それは、どうやら auto 型はしばしば文書化およびサニティチェックの一形態であるため、使いすぎの可能性があります。を使うことの線引きはどこにあるのでしょうか? auto また、この新機能の推奨ユースケースは何でしょうか?

私は、標準化委員会がこのキーワードをどのように使用することを意図しているか、また、その意図する使用が実際にどのように実現されているかについてのコメントを求めているのです。

どのように解決するのか?

を使うべきと思います。 auto キーワードは、一見すると型をどう書けばいいのかわからないが、式の右辺の型は明らかである場合に使う。例えば、使用する。

my_multi_type::nth_index<2>::type::key_type::composite_key_type::
    key_extractor_tuple::tail_type::head_type::result_type

で複合キーの型を取得します。 boost::multi_index であることが分かっていても int . と書くことはできません。 int なぜなら、将来変更される可能性があるからです。私ならこう書きます。 auto この場合

ということは、もし auto キーワードは、特定のケースで読みやすさを向上させるために使用します。次のように書くことができます。 auto がどのような型であるかが読者に明らかな場合 auto を表します。

以下はその例です。

auto foo = std::make_shared<Foo>();   // obvious
auto foo = bla();                     // unclear. don't know which type `foo` has

const size_t max_size = 100;
for ( auto x = max_size; x > 0; --x ) // unclear. could lead to the errors
                                      // since max_size is unsigned

std::vector<some_class> v;
for ( auto it = v.begin(); it != v.end(); ++it )
                                      // ok, since I know that `it` has an iterator type
                                      // (don't really care which one in this context)