底辺大学の院生がプログラミングや機械学習を勉強するブログ

勉強していることを雑にまとめるブログ。当然、正しさの保証は一切しない。

autoキーワードとアロー演算子

昨日なんか書くネタあるかなーって、C++のことを色々調べてたらこんなコード見つけた。

auto add(const int x, const int y) -> int
{
	return x + y;
}

???



f:id:telltales:20160706223853p:plain

なんやこのコード……。



まあ予想はつくけど、戻り値の型を明示的にするための演算子のようだ。
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キーワードを使えば、多くの場合で省略可能である。

共通している点は、

  1. autoキーワードがついてる
  2. 関数の戻り値の型を表している
  3. 関数の引数を記述する括弧と関数本体の間に書かれている

かな。
1.が直接関わってそうだけど、うーん、関数の方のautoは戻り値の型を指してるのに対して、ラムダ式のはラムダ式自体の型を指してるわけだから、微妙に役割が違う気もする。

ただ、ラムダ式の方の型指定の方は、省略出来ないパターンもあるから意義自体は理解できる。
例えば次のような場合戻り値の指定部を省略できない。

const auto init_vector = 
  [](const int x, const int y) -> std::vector<int> { return{ x, y }; };


でもなー、ラムダ式はともかく関数の方の「-> 型名」は別に省略してもいいし、どうしても戻り値の型を書きたければautoのとこを書き換えればいい。
やはりこの構文の意義が全くわからん。