autoキーワードとアロー演算子
昨日なんか書くネタあるかなーって、C++のことを色々調べてたらこんなコード見つけた。
auto add(const int x, const int y) -> int { return x + y; }
???
なんやこのコード……。
まあ予想はつくけど、戻り値の型を明示的にするための演算子のようだ。
autoで推論してるのにわざわざ明示する意味とは……という感じだし、
int add(const int x, const int y) { return x + y; }
との違いも全くわからなかったけど、そういえば似たような使い方をどこかで見たなとふと思った。
const auto add = [](const int x, const int y) -> int { return x + y; };
そうラムダ式の戻り値の型指定。
ここにも「-> 型名」という形式が現れてる。
そしてこれも、autoキーワードを使えば、多くの場合で省略可能である。
共通している点は、
- autoキーワードがついてる
- 関数の戻り値の型を表している
- 関数の引数を記述する括弧と関数本体の間に書かれている
かな。
1.が直接関わってそうだけど、うーん、関数の方のautoは戻り値の型を指してるのに対して、ラムダ式のはラムダ式自体の型を指してるわけだから、微妙に役割が違う気もする。
ただ、ラムダ式の方の型指定の方は、省略出来ないパターンもあるから意義自体は理解できる。
例えば次のような場合戻り値の指定部を省略できない。
const auto init_vector = [](const int x, const int y) -> std::vector<int> { return{ x, y }; };
でもなー、ラムダ式はともかく関数の方の「-> 型名」は別に省略してもいいし、どうしても戻り値の型を書きたければautoのとこを書き換えればいい。
やはりこの構文の意義が全くわからん。