Меня смущает следующий код:
struct test {
void f() & {
std::cout << "&" << std::endl;
}
void f() const& {
std::cout << "const&" << std::endl;
}
void f() && {
std::cout << "&&" << std::endl;
}
void f() const&& {
std::cout << "const&&" << std::endl;
}
void g() & {
std::cout << "& -> ";
f();
}
void g() const& {
std::cout << "const& -> " ;
f();
}
void g() && {
std::cout << "&& -> ";
f();
}
void g() const&& {
std::cout << "const&& -> ";
f();
}
test() {} //allow default const construction
};
int main(int, char**) {
test value;
const test constant;
value.g();
constant.g();
std::move(value).g();
std::move(constant).g();
}
Когда я компилирую с clang 3.5, я получаю этот вывод:
& -> &
const& -> const&
&& -> &
const&& -> const&
Почему здесь отбрасывается квалификатор r-значения? И есть ли способ вызвать f
из g
с помощью правого классификатора?