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)
はやめてほしい