Указатель на lvalue/rvalueC++

Программы на C++. Форум разработчиков
Ответить
Гость
 Указатель на lvalue/rvalue

Сообщение Гость »

Предположим, что у вас есть структура, которая имеет член, а также оператор*, который перенаправляет доступ к этому члену, сохраняя при этом категорию значения:

Код: Выделить всё

struct Bar {
void func() & {
printf("func() &\n");
}
void func() && {
printf("func() &&\n");
}
};

struct Foo {
Bar bar;

Bar &operator*() & {
return bar;
}
Bar &&operator*() && {
return static_cast(bar);
}
};

int main() {
Foo foo;

(*foo).func();   // prints func() &
(*Foo()).func(); // prints func() &&
}
Теперь добавим оператор-> в Foo, чтобы было проще вызывать func():

Код: Выделить всё

struct Foo {
// ...

Bar *operator->() & {
return &bar;
}

// this should return "pointer to rvalue Bar"
Bar *operator->() && {
return &bar;
}
};
Проблема в том, что не существует указателя на lvalue/rvalue, поэтому оба они вызывают функцию lvalue func() &:

Код: Выделить всё

int main() {
Foo foo;

foo->func();   // prints func() &
Foo()->func(); // prints func() &
}
У меня два вопроса, практический и теоретический:
  • можно ли иметь оператор-> каким-то образом поддерживает категорию значений так же, как оператор*, сохраняя при этом тот же синтаксис вызова?
  • разве это не дыра в системе типов C++?
(Обратите внимание: тип, похожий на Foo, std::optional имеет такое же поведение.)

Подробнее здесь: https://stackoverflow.com/questions/782 ... lue-rvalue
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»