C++1y 通常の関数の戻り値型を推論

N3638 Return type deduction for normal functions


ラムダ式では、return文から戻り値の型を自動的に推論してくれますが、通常の関数は推論してくれません。この提案は、ラムダ式と同じく、通常の関数でも戻り値型を推論できるようにしよう、というものです。
通常の関数で戻り値を推論してほしい場合は、関数宣言の戻り値型を「auto」にします。

auto f(); // 関数f()の宣言。戻り値の型は「不明」。

auto f() { return 1; } // 関数f()の戻り値型はint

int x = f(); // x == 1

参照型を返したい場合は、戻り値の型をauto&にします。

int x = 3;
auto& f() { return x; }

int& r = f();

ここまでの機能は、GCC 4.8で-std=c++1yオプションを付けることで、すでに使用できます。


関数の戻り値型推論に合わせて、decltype(auto)という型の構文が提案されています。これは、decltype意味論での型推論を行います。参照を返す関数があった場合、

int x = 3;
auto& f() { return x; }

この関数の戻り値をautoで受け取ってしまうと、型推論ルールによって、その型はint&ではなくintになってしまいます。その解決策としては、C++11段階では「auto& r = f()」か「decltype(f()) r = f();」のようにする必要がありました。decltype(auto)は、このようなコードの繰り返しを避けるために提案されているようです。


decltype(auto)は、GCC 4.9に含まれる予定です。
GCC 4.9 Release Series - Changes, New Features, and Fixes


# 個人的にはdecltype(auto)はやめてほしい