2014-12-15 - rvalue to this

rvalue reference to this allows you to create member functions, callable if this is in fact rvalue. it is similar to const member functions. for member function foo() a syntax would like this:

void foo() &&;

nice and straight forward. but that's where const-analogy breaks. for const and non-const overloads one does:

void foo();
void foo() const;

now let's try it with rvalue:

void foo();
void foo() &&;

and now computer says “no”:

error: ‘void X::foo() &&’ cannot be overloaded
 void foo() &&;
      ^
error: with ‘void X::foo()’
 void foo();
      ^

what is going on? at first i though this feature is not yet implemented on GCC. after double checking – it IS implemented… so let's try clang:

error: cannot overload a member function with ref-qualifier '&&' with a member function without a ref-qualifier
  void foo() &&;
       ^                    
note: previous declaration is here
  void foo();                    
       ^

as usually clang is a bit more human friendly here. already see the problem? code should look like this:

void foo() &;  // <-- '&' here...
void foo() &&;

it appears that member functions, when overload for ref, need proper ref-qualifier on both overloads! why it is so? it is still a mystery to me…

btw: if you wonder about this:

void foo();
void foo() &;
void foo() &&;

no – it does not work:

error: cannot overload a member function with ref-qualifier '&' with a member function without a ref-qualifier