По-видимому, перегрузка на ref-qualifiers не разрешена - этот код не будет компилироваться, если вы удалите либо &
, либо &&
(только токены, а не их функции):
#include <iostream>
struct S {
void f() & { std::cout << "Lvalue" << std::endl; }
void f() && { std::cout << "Rvalue" << std::endl; }
};
int main()
{
S s;
s.f(); // prints "Lvalue"
S().f(); // prints "Rvalue"
}
Другими словами, если у вас есть две функции с одним и тем же именем и типом, вы должны определить оба, если вы определяете либо. Я предполагаю, что это преднамеренно, но какая причина? Почему бы не разрешить, скажем, вызывать версию &&
для rvalues, если она определена, и "первичный" f()
для всего остального в следующем варианте (и наоборот - хотя это будет запутать):
struct S {
void f() { std::cout << "Lvalue" << std::endl; }
void f() && { std::cout << "Rvalue" << std::endl; }
};
Другими словами, пусть они действуют аналогично специализированным шаблонам в отношении первичного шаблона.