7 Standard conversions [conv]

7.1 Lvalue-to-rvalue conversion [conv.lval]

A glvalue нефункционального типа, T не являющегося массивом, может быть преобразован в prvalue.57 Если T это неполный тип, программа, которая требует этого преобразования, плохо сформирована. Если T это неклассовый тип, то тип prvalue - это неквалифицированная версия cv T. В противном случае тип prvalue - T.58

Когда преобразование lvalue-to-rvalue применяется к выражению e, и либо

  • e потенциально не оценивается, или

  • оценка e результатов при оценке члена ex множества потенциальных результатов eи ex именует переменную, x которая не odr-used является ex,

значение, содержащееся в указанном объекте, недоступно. [Example:

struct S { int n; };
auto f() {
  S x { 1 };
  constexpr S y { 2 };
  return [&](bool b) { return (b ? y : x).n; };
}
auto g = f();
int m = g(false);   // undefined behavior due to access of x.n outside its lifetime
int n = g(true);    // OK, does not access y.n

end example]

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

  • Если T есть cv std​::​nullptr_­t, то результатом будет null pointer constant. [ Note: Поскольку значение не извлекается из памяти, нет побочного эффекта для энергозависимого доступа ([intro.execution]), и union можно получить доступ к неактивному члену a . ]end note

  • В противном случае, если T есть тип класса, преобразование копирует-инициализирует объект результата из glvalue.

  • В противном случае, если объект, на который ссылается glvalue, содержит недопустимое значение указателя ([basic.stc.dynamic.deallocation], [basic.stc.dynamic.safety]), поведение определяется реализацией.

  • В противном случае значение, содержащееся в объекте, указанном параметром glvalue, является результатом prvalue.

[ Note: См. Также [basic.lval]. ]end note

По историческим причинам это преобразование называется преобразованием «lvalue-to-rvalue», хотя это имя не точно отражает таксономию выражений, описанных в [basic.lval].

В C ++ класс и массив prvalue могут иметь типы с квалификацией cv. Это отличается от ISO C, в котором значения, отличные от lvalue, никогда не имеют типов с квалификацией cv.