Я понимаю, почему вы в замешательстве. Следует помнить, что всякий раз, когда у вас есть имя переменной, у вас есть l-value.
Так что, когда вы говорите:
int i = 0; // lvalue (has a name i)
А также
int&& i = 0; // lvalue (has a name i)
Так в чем разница?
int&&
может связывать только к г-значение так:
int n = 0;
int i = n; // legal
НО
int n = 0;
int&& i = n; // BAD!! n is not an r-value
Однако
int&& i = 5; // GOOD!! 5 is an r-value
Так при переходе i
к f()
в этом примере вы пропускании л-значение, а не г-значение:
void f(int &&);
int&& i = 5; // i is an l-value
f(i); // won't accept l-value
Ситуация на самом деле немного сложнее, чем я представил здесь. Если вас интересует более полное объяснение, то эта ссылка достаточно полная: http://en.cppreference.com/w/cpp/language/value_category
Что вы надеетесь, произойдет? Что ты пытаешься сделать? Как вы думаете, '&&' означает в этом контексте? – Galik
@Galik, я добавил еще несколько комментариев к моему вопросу. –
Используйте 'std :: move()' для получения ссылки rvalue. –