以下のコードを考えると、すべてが機能します。変数dがintを参照しているのはなぜですか?何が起こっている?
int main()
{
int a= 10;
int &&b = a+10; // b is int &&
auto c =b+10; // c is int
auto &&d = a; // d is int&
//int &&di = a; // error, as expected
return (0);
}
これは、型推論における参照の折りたたみ規則に関係しています。
A& & becomes A&
A& && becomes A&
A&& & becomes A&
A&& && becomes A&&
参照の折りたたみルールに加えて言及する価値があるのは、d を強制的に右辺値参照にする方法です。これには std::move を使用できます。
int a =4;
auto &&d = std::move(a); // d is type &&
もちろん、整数について話すときは、値渡しも同様に効率的であるため、右辺値参照はばかげています。これは、移動セマンティックの最適化を強制するのに役立ちます。たとえば、複雑な型を関数の最後に挿入したい場合、その型がスコープ外になる場合などに便利です...
vector<std::string> v;
void f()
{
string s;
foo(s); // do some kind of operation on s.
v.push_back(std::move(s)); // use push_back( &&) instead of push_back(const &);
}
型推論には特別なルールがあります。"auto&&"はauto &&d = a;
非 const 非揮発性型への右辺値参照であり、"a" は左辺値であり、この特別な規則が適用されます: "a" の型は int ではなく int& として扱われます。次に、通常どおり、「a」のタイプと同じになるように「auto」のタイプ、つまり int& を選択します。したがって、「auto&&」のタイプは、bames53 で言及されているように、参照の崩壊によると int& です。
auto&&
完全転送を呼び出します。a
タイプ の左辺値と同様にint
、d
は への左辺値参照int
です。