What does the single ampersand after the parameter list of a member function declaration mean?
c++, c++11
Solution
It means the member will be invoked when the object is an lvalue reference.
`[C++11: 9.3.1/5]:` A non-static member function may be declared with a ref-qualifier (8.3.5); see 13.3.1.
`[C++11: 13.3.1/4]:` For non-static member functions, the type of the implicit object parameter is
- “lvalue reference to cv `X`” for functions declared without a ref-qualifier or with the `&` ref-qualifier
- “rvalue reference to cv `X`” for functions declared with the `&&` ref-qualifier
where `X` is the class of which the function is a member and cv is the cv-qualification on the member function declaration. [..]
(and some more rules that I can't find)
Without a ref-qualifier, the function can always be invoked, regardless of the value category of the expression through which you're invoking it:
struct foo
{
void bar() {}
void bar1() & {}
void bar2() && {}
};
int main()
{
foo().bar(); // (always fine)
foo().bar1(); // doesn't compile because bar1() requires an lvalue
foo().bar2();
foo f;
f.bar(); // (always fine)
f.bar1();
f.bar2(); // doesn't compile because bar2() requires an rvalue
}
Live demo (thanks Praetorian)
Problem
From the answer here. ``` class wrap { public: operator obj() const & { ... } //Copy from me. operator obj() && { ... } //Move from me. private: obj data_; }; ``` I know the `&&` means that the member will be invoked when the object is an rvalue reference. But what does the single ampersand mean? How is it different than without the ampersand?