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.
По историческим причинам это преобразование называется преобразованием «lvalue-to-rvalue», хотя это имя не точно отражает таксономию выражений, описанных в [basic.lval].
В C ++ класс и массив prvalue могут иметь типы с квалификацией cv. Это отличается от ISO C, в котором значения, отличные от lvalue, никогда не имеют типов с квалификацией cv.