関数の戻り値の型としてautoを指定すると、戻り値の型をreturn文から推定してくれる。
// int ()
auto a(){ return 0 ; }
// double ()
auto b(){ return 0.0 ; }
// T(T)
template < typename T >
auto c(T t){ return t ; }
return文の型が一致していないとエラーとなる。
auto f()
{
return 0 ; // エラー、一致してない
return 0.0 ; // エラー、一致していない
}
すでに型が決定できるreturn文が存在する場合、関数の戻り値の型を参照するコードも書ける。
auto a()
{
&a ; // エラー、aの戻り値の型が決定していない
return 0 ;
}
auto b()
{
return 0 ;
&b ; // OK、戻り値の型はint
}
関数aへのポインターを使うには関数aの型が決定していなければならないが、return文の前に型は決定できないので関数aはエラーになる。関数bはreturn文が現れた後なので戻り値の型が決定できる。
再帰関数も書ける。
auto sum( unsigned int i )
{
if ( i == 0 )
return i ; // 戻り値の型はunsigned int
else
return sum(i-1)+i ; // OK
}
このコードも、return文の順番を逆にすると戻り値の型が決定できずエラーとなるので注意。
auto sum( unsigned int i )
{
if ( i != 0 )
return sum(i-1)+i ; // エラー
else
return i ;
}
機能テストマクロは__cpp_return_type_deduction。値は201304。