ユニヴァーサル参照

std::moveの仕様を見ると、

move (utility) - cpprefjp C++日本語リファレンス

"T&& t"という引数の型を見ると、右辺値参照っぽいのになぜ左辺値も引数に取れるのか不思議に思う・・・。
実は、テンプレート関数など、T&&での推論が発生する状況においては、右辺値なら右辺値参照、左辺値なら左辺値参照、という動作をするようになっている・・・。
これをユニヴァーサル参照という・・・。

発生する条件はちょっと複雑で詳しくは、

Universal Reference is 何 - 冬でもスイカバーが食べたい
右辺値参照・ムーブセマンティクス - cpprefjp C++日本語リファレンス

を参照のこと・・・。

とりあえず、右辺値も左辺値も取れるのか試してみる・・・。

funcの定義でT&&で引数を取るようにして、funcに右辺値10と左辺値x(1を代入済み)を渡して呼ぶ・・・。

$ g++ universal_reference.cpp -o universal_reference -std=c++11
$ ./universal_reference
x = 1
val = 10 in func()
val = 100 in func()
val = 1 in func()
val = 100 in func()
x = 100
$

右辺値でも左辺値でもfuncの中で代入できる・・・。
ただ、右辺値の場合は本来一時オブジェクトのものに入れてるので保証しない・・・。

Sample/cpp/universal_reference/universal_reference/src/universal_reference at master · bg1bgst333/Sample · GitHub