GCC 4.8.0 がリリースされ、C++14 の一部である自動戻り値の型推論をサポートするコンパイラができました。 を使用すると-std=c++1y
、次の操作を実行できます。
auto foo() { //deduced to be int
return 5;
}
私の質問は、この機能はいつ使用すればよいのかということです。いつ必要になり、いつコードがクリーンになるのでしょうか。
シナリオ1
私が思いつく最初のシナリオは、可能な場合はいつでもです。この方法で記述できるすべての関数は、この方法で記述する必要があります。これの問題点は、必ずしもコードが読みやすくなるとは限らないことです。
シナリオ2
次のシナリオは、より複雑な戻り値の型を避けることです。非常に簡単な例として:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
それが実際に問題になるとは思いませんが、戻り値の型がパラメータに明示的に依存する方が、場合によってはより明確になると思います。
シナリオ3
次に、冗長性を防ぐために:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
C++11 では、return {5, 6, 7};
ベクトルの代わりに を使用できる場合もありますが、常にうまくいくとは限らず、関数ヘッダーと関数本体の両方で型を指定する必要があります。これは完全に冗長であり、自動戻り型推論によってその冗長性が回避されます。
シナリオ4
最後に、非常に単純な関数の代わりに使用できます。
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
ただし、場合によっては、関数を見て正確な型を知りたいと思うことがありますが、そこに型が指定されていない場合は、pos_
宣言されている場所など、コード内の別のポイントに移動する必要があります。
結論
これらのシナリオを説明しましたが、実際にこの機能がコードをよりクリーンにするのに役立つのはどのシナリオでしょうか? ここで言及しなかったシナリオについてはどうでしょうか? 後で困らないように、この機能を使用する前にどのような予防措置を講じておくべきでしょうか? この機能によってもたらされる新しい機能で、この機能がなければ実現できないものはありますか?
複数の質問は、これに答えるための視点を見つけるのに役立つことを目的としていることに注意してください。
ベストアンサー1
C++11 でも同様の疑問が生じます。ラムダで戻り値の型推論をいつ使用するか、auto
変数をいつ使用するか、といった疑問です。
C および C++03 でのこの質問に対する従来の回答は、「ステートメントの境界を越えて型を明示的にします。式内では通常暗黙的ですが、キャストを使用して明示的にすることができます」というものでした。C++11 および C++1y では、新しい場所で型を省略できるように、型推論ツールが導入されています。
申し訳ありませんが、一般的なルールを定めても、この問題は解決できません。特定のコードを見て、あちこちで型を指定することが読みやすさに役立つかどうかを自分で判断する必要があります。コードで「このものの型は X です」と記述する方がよいのでしょうか、それとも「このものの型は、コードのこの部分を理解するのに無関係です。コンパイラーはそれを知る必要があり、おそらく解決できるでしょうが、ここで記述する必要はありません」と記述する方がよいのでしょうか。
「読みやすさ」は客観的に定義されておらず[*]、さらに読者によっても異なるため、スタイル ガイドで完全に満たすことができないコードの作成者/編集者としての責任があります。スタイル ガイドが規範を規定しているとしても、人によって好む規範は異なり、なじみのないものは「読みにくい」と感じる傾向があります。そのため、提案された特定のスタイル ルールの読みやすさは、多くの場合、他のスタイル ルールとの関連でしか判断できません。
すべてのシナリオ (最初のものも含む) は、誰かのコーディング スタイルで利用されます。個人的には、2 番目の使用例が最も説得力のある使用例だと思いますが、それでも、ドキュメント ツールに依存すると予想しています。関数テンプレートの戻り値の型が であるとドキュメント化されてもあまり役に立ちませんがauto
、 とドキュメント化されると、decltype(t+u)
(うまくいけば) 信頼できる公開インターフェイスが作成されます。
[*] 時々、客観的な測定をしようとする人がいます。統計的に有意で一般的に適用可能な結果が出たとしても、現役のプログラマーはそれを完全に無視し、著者の「読みやすい」という直感を優先します。