5

以下のコードを考えると、すべてが機能します。変数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);
}
4

5 に答える 5

7

これは、型推論における参照の折りたたみ規則に関係しています。

A& & becomes A&
A& && becomes A&
A&& & becomes A&
A&& && becomes A&&
于 2012-04-19T14:03:33.370 に答える
4

参照の折りたたみルールに加えて言及する価値があるのは、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 &); 
}
于 2012-08-29T05:01:00.747 に答える
3

型推論には特別なルールがあります。"auto&&"はauto &&d = a;非 const 非揮発性型への右辺値参照であり、"a" は左辺値であり、この特別な規則が適用されます: "a" の型は int ではなく int& として扱われます。次に、通常どおり、「a」のタイプと同じになるように「auto」のタイプ、つまり int& を選択します。したがって、「auto&&」のタイプは、bames53 で言及されているように、参照の崩壊によると int& です。

于 2012-04-20T02:37:39.600 に答える
1

auto&&完全転送を呼び出します。aタイプ の左辺値と同様にintdは への左辺値参照intです。

于 2012-04-19T12:41:34.727 に答える