Происходит ли когда-нибудь преобразование lvalue в rvalue с типами классов? - PullRequest
7 голосов
/ 02 апреля 2020

Практически каждый пример преобразования lvalue в rvalue, который я видел в Интернете, относится к фундаментальным типам, таким как int et c.

Я не смог найти пример l2r, применимый к сам класс набирает; во всех, казалось бы, применимых примерах обычно есть функция imvolved, которая принимает lvalue-ref (например, copy-ctor), для которого l2r кажется подавленным (см., например, этот вопрос).

Однако в описании самого l2r есть предложение о типах классов (из [conv.lval]):

результат преобразования определяется по следующим правилам:

< ...> если T имеет тип класса, преобразование копирует и инициализирует временное значение типа T из glvalue, и результатом преобразования является предварительное значение для временного.

Может ли кто-нибудь дать пример этого пункта? Я не могу.

1 Ответ

4 голосов
/ 02 апреля 2020

Примером являются летучие объекты в выражениях отбрасываемых значений:

struct A {};

void f()
{
    volatile A a;
    a;
} 

Согласно [expr.context] / 2 :

В некоторых контексты, выражение появляется только для его побочных эффектов. Такое выражение называется выражением отброшенного значения . Стандартные преобразования массива в указатель и функции в указатель не применяются. Преобразование lvalue в rvalue применяется тогда и только тогда, когда выражение является glvalue типа volatile-квалифицированного и является одним из следующих :

  • ...
  • id-выражение ,
  • ...

Применяется преобразование Lvalue-в-значение до a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...