В приведенном ниже коде содержится Undefined Поведение. Обязательно прочитайте ВСЕ ответы для полноты.
При привязке объекта через operator<< я хочу сохранить lvalue-ness/rvalue-ness объекта:
class Avenger {
public:
Avenger& operator<<(int) & {
return *this;
}
Avenger&& operator<<(int) && {
return *this; // compiler error cannot bind lvalue to rvalue
return std::move(*this);
}
};
void doJustice(const Avenger &) {};
void doJustice(Avenger &&) {};
int main() {
Avenger a;
doJustice(a << 24); // parameter should be Avenger&
doJustice(Avenger{} << 24); // parameter should be Avenger&&
return 0;
}
Я не могу просто вернуть *this, что означает, что тип *this объекта rvalue все еще является lvalue reference. Я ожидал бы rvalue reference.
- Правильно ли/рекомендуется возвращать
std::move(*this)член, перегруженный для квалификатора&&, или использовать другой метод? Я знаю, чтоstd::move- это просто актерский состав, поэтому я думаю, что все в порядке, я просто хочу дважды проверить. - В чем причина/объяснение того, что
*thisдляrvalueявляетсяlvalue reference, а неrvalue reference? - Я помню, что видел в С++ 14 что-то о семантике перемещения
*this. Связано ли это с этим? Будет ли любое из приведенных выше изменений в С++ 14?