В приведенном ниже коде содержится 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?