Passing int&& to f(int&&)

后端 未结 3 1691
小蘑菇
小蘑菇 2020-12-06 09:34

What is exactly happening here? Why is this an error?

void f(int &&);

int && i = 5;

f(i);

Isn\'t it a bit counterintuitiv

3条回答
  •  庸人自扰
    2020-12-06 10:28

    I see why you are confused. The thing to remember is that whenever you have a variable name, you have an l-value.

    So when you say:

    int i = 0; // lvalue (has a name i)
    

    And also

    int&& i = 0; // lvalue (has a name i)
    

    So what is the difference?

    The int&& can only bind to an r-value so:

    int n = 0;
    int i = n; // legal
    

    BUT

    int n = 0;
    int&& i = n; // BAD!! n is not an r-value
    

    However

    int&& i = 5; // GOOD!! 5 is an r-value
    

    So when passing i to f() in this example you are passing an l-value, not an r-value:

    void f(int &&);
    
    int&& i = 5; // i is an l-value
    
    f(i); // won't accept l-value
    

    The situation is actually a little more complicated than I have presented here. If you are interested in a fuller explanation then this reference is quite thorough: http://en.cppreference.com/w/cpp/language/value_category

提交回复
热议问题