Я немного искал ref-qualifiers, следуя предыдущему вопросу.
Учитывая пример кода ниже;
#include <iostream>
#include <string>
#include <utility>
struct A {
std::string abc = "abc";
std::string& get() & {
std::cout << "get() &" << std::endl;
return abc;
}
std::string get() && {
std::cout << "get() &&" << std::endl;
return std::move(abc);
}
std::string const& get() const & {
std::cout << "get() const &" << std::endl;
return abc;
}
std::string get() const && {
std::cout << "get() const &&" << std::endl;
return abc;
}
};
int main()
{
A a1;
a1.get();
const A a2{};
a2.get();
A().get();
const A a3{};
std::move(a3).get();
}
И результат будет таким, как вы ожидали:
get() и
get() const и
get() &&
get() const && &
Это компилируется и работает с clang и gcc 4.9.1 (но не 4.9.0). Live пример здесь.
В общем коде (пример показывает, как код компилируется и запускается).
- Какова была бы цель
const &&
ref-qualifier для метода?
Метод не может изменить содержимое объекта (это const
), попытка return std::move(abc);
из метода const &&
вообще не перемещает std::string
. Предположительно, вы захотите изменить объект, так как это значение r и не будет долгое время. Если метод const &&
должен быть удален, код std::move(a3).method()
будет привязан к const &
квалифицированному методу, что имеет смысл.
- Что, если таковые имеются, подразумевала бы семантическую разницу между методом, указанным как
const &
, а один - какconst &&
? То есть как реализация будет отличаться или почему вы хотите оба? - Может ли
std::string
быть "перемещенным" из временного объекта? - Что будет выглядеть "каноническая" подпись для
std::string get() const &&
в этом случае?