3 ms·
| but a more technical understanding requires the knowledge that rvalue references can bind to any l- or rvalue I don't think that's true. rvalue references c
by monk_the_dog 12y ago
| but a more technical understanding requires the knowledge that rvalue references can bind to any l- or rvalue
I don't think that's true. rvalue references can only bind to rvalues.
Here's a complete program. foo(i) won't compile bacause i is not an rvalue. bar(i) will compile, and foo(1) will compile.
#include <iostream>
using namespace std;
int foo(int&& i){
return i;
}
template<class T>
T bar(T&& i){
return i;
}
int main()
{
int i=0;
cout << foo(i) << endl;
return 0;
}
edit: I am replying humbly. C++ is a complex language and I might very well be wrong.
- splinterofchaos 12y agoI did not mean "any rvalue-reference" and bind to "any l- or rvalue", but that you can have an "int &&", "int& &&", "const int& &&", and even "int&& &&". I updated my comment to say "can be made from" instead "can bind to". Your code example does not work because you call "foo" instead of "bar". But consider this one: #include <iostream> using namespace std; template<class T> T bar(T&& i){ return std::forward<T>(i); } int main() { int i=0; cout << bar<int&&>(6) << endl; return 0; }
- monk_the_dog 12y agoMaybe you're confusing reference collapsing with universal references? In your example, replace bar<int&&>(6) to bar<int&&>(i). It won't compile because i is not an r value. bar(i) will compile, because the template parameter is a universal reverence that will become an lvalue (not an rvalue) through reference collapsing.
- splinterofchaos 12y agoI called "bar" with "<int&&>" to demonstrate that you can bind an rvalue-ref to an rvalue-ref, not to suggest that's how it should be called.