§ 5, który opisuje składnię poprawnych wyrażeń, listy dla każdej składni wyrażenia warunki, w których wyrażenie jest lwartością, xwartością lub prwartością. Pełna lista możliwych x wartości z punktu 5 to:
5.2.2 punkt 10: Wywołanie funkcji jest ... x wartością, jeśli typ wyniku jest referencją rwartości do typu obiektu.
(W języku technicznym Standardu „typ obiektu” nie znaczy to samo co „typu klasy.” „Obiekt” zawiera podstawowe typy, wskaźniki i tablice, a nie obejmuje jedynie rodzaje funkcji. Odwołanie do typu r funkcji jest zawsze traktowane jako l, a nie jako wartość.)
Najbardziej znaczącymi funkcjami, które zwracają wartość odniesienia r, są oczywiście std::move
, a czasami std::forward
.
5.2.5 ustęp 4: Jeżeli E2
jest non-static członek dane ... jeśli E1
jest xvalue, następnie E1.E2
jest xvalue
(Z drugiej strony, członek dane wyszukiwanie E1->E2
zawsze lwartością)
Podobnie, E1
jest xvalue, wówczas wyszukiwanie element danych E1.*E2
jest xvalue.
5.5 paragraf 6: Wynik wyrażenia .*
, którego drugi operand jest wskaźnikiem do elementu danych, należy do tej samej kategorii wartości (3.10), co jego pierwszy operand.
Dla różnych rodzajów odlewów:
dynamic_cast<Type>(expr)
: 5.2.7 ustęp 2
static_cast<Type>(expr)
: 5.2.9 ustęp 1
reinterpret_cast<Type>(expr)
: 5.2.10 ustęp 1
const_cast<Type>(expr)
: 5.2.11 paragraf 1
(Type) expr
: 5.4 paragraf 1
Wyrażenie ma wartość x wtedy i tylko wtedy, gdy Type
jest referencją rwartości do typu obiektu.To samo odnosi się również do , ponieważ
5.2.3 pkt 1: Jeżeli lista wyraz [w nawiasach po nazwie Type] jest pojedynczy wyraz, wyrażenie typu konwersja jest równoważny (w definedness, a jeśli zdefiniowane w znaczeniu) do odpowiedniego wyrażenia rzutowania (5.4).
(Z drugiej strony, Type{expr}
zawsze prvalue).
Rozdział 5.16 od operatora warunkowego kończy się mówi, że A ? B : C
może być czasem xvalue gdy B i/lub C jest xvalue. Ale pełne reguły są trudne do podsumowania.
Jeśli wyraz kończy się wywołanie funkcji przeciążony operatora zdefiniowanego przez użytkownika, a następnie sekcja 5.2.2 stosuje się do tej wypowiedzi, a nie ten, który opisuje wbudowany zachowanie operatora. (Patrz wyrażenie a + a
w przykładzie @James pisał.)
Kompletna odpowiedź: [Czym są wartości r, wartości l, x wartości, wartości gl i wartości prody?] (Http://stackoverflow.com/questions/3601602/what-are-rvalues-lvalues-xvalues-glvalues-and-prvalues) – pmr
Ta część normy wyjaśnia ogólne pojęcie tego terminu. Nie wyszczególnia każdego rodzaju wyrażenia, które generuje xvalue. Tak dzieje się gdzie indziej w standardzie. –
@NicolBolas: Przeczytałem to pytanie i udzielono odpowiedzi przedtem, dlatego postanowiłem zamieścić kolejne pytanie z tego powodu. – PermanentGuest