const参照引数

以下の関数呼び出しはコンパイルエラーにも実行時エラーにもなりません

template<typename T>
T add(const T& x,const T& y)
{ return x+y; }

int main()
{
    auto a = add(10,11); //rvalue渡し
}

lvalue引数にrvalueを渡しているのだから
エラーになりそうなものですが
T const&(あるいはconst T&)のようなconst参照型引数であれば
一次変数でも渡して問題ないようでした
(constの無い普通の参照型引数だとコンパイヨ時に怒られます)

std::string const&引数に文字リテラルを渡したときでも同様の効果が
あることは知っていたのですが、const参照型引数全般に
そのような効果があることは、今しがた知りました

ちなみに、処理時間を比較するとmove-semanticsを使用したほうが速いようです
http://melpon.org/wandbox/permlink/qyvwCFXZ5zRf33sr
(微々たる物でしたが)