単にautoで変数を宣言すると、テンプレート関数の引数型と同じ規則によって変数型が決まります。例えば、
コード:
template<typename T>void f(T arg){}
にint const&な値を渡した場合、argの型はconstも参照も外れた単なるint型になります。それと同じで、
コード:
auto val = f();//const hoge& f();
とすると、変数valの型は単なるhogeになります。
関数の戻り値をconst&にするかどうかはケースバイケースなのですが、const&を返す場合は、関数内で寿命が尽きるオブジェクトを戻り値にしないように注意しなければいけないので、戻り値にできるのはグローバル変数、static変数あるいはクラスのメンバ変数くらいに限られます。
単にautoで変数を宣言すると、テンプレート関数の引数型と同じ規則によって変数型が決まります。例えば、[code=cpp]template<typename T>void f(T arg){}[/code]にint const&な値を渡した場合、argの型はconstも参照も外れた単なるint型になります。それと同じで、[code]auto val = f();//const hoge& f();[/code]とすると、変数valの型は単なるhogeになります。
関数の戻り値をconst&にするかどうかはケースバイケースなのですが、const&を返す場合は、関数内で寿命が尽きるオブジェクトを戻り値にしないように注意しなければいけないので、戻り値にできるのはグローバル変数、static変数あるいはクラスのメンバ変数くらいに限られます。