Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

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

void f(int &&);

int && i = 5;

f(i);

Isn't it a bit counterintuitive?

I would expect i to be a rvalue reference, and so be able to pass it to f(). But I get an error;

no known conversion from int to int &&

So I guess i is not an rvalue reference after declaration?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
175 views
Welcome To Ask or Share your Answers For Others

1 Answer

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...