2015-07-16 10 views
5

Widziałem w projekcie N4268 koncepcji o nazwie „unnamed lwartość” w ramach striked chociaż poniżejCo to jest nienazwana wartość l?

[Uwaga: tymczasowych, nienazwane lwartościami i nazwane lwartościami bez powiązania są tymczasowy obiekt jest niedopuszczalne argumenty-szablonów, gdy odpowiadający im szablon-parametr ma typ referencyjny. [Przykład: ...]]

Szukałem dużo, ale ani stackoverflow ani google nie dał mi odpowiedzi. ja tylko znalazłem ten post o kategoriach wartości

What are rvalues, lvalues, xvalues, glvalues, and prvalues

Ale to nie pomogło.

+0

[Sposób rozpoznawania wartości R lub L-końcowej i reguły-jeśli-ma-nazwę-nazwy] (http://stackoverflow.com/q/27554296/3953764) –

+0

'* ptr' jest przykładem lwartości bez nazwy –

+0

Wyrażenie wywołania funkcji, w którym wspomniana funkcja ma typ powrotu wartości odniesienia l, jest także nienazwaną wartością l. – ibrahim5253

Odpowiedz

4

Nie wszystkie wyrażenia lvalue mają nazwy. W rzeczywistości, sformułowanie w N4296 daje nam kilka przykładów:

Dla non-type szablonach parametru odniesienia lub rodzaju wskaźnik, wartość o stałej ekspresji nie odnoszą się do (lub za pomocą wskaźnika typu nie powinien być adres):

  • podobiekt (1,8),
  • tymczasowy obiekt (12,2),
  • ciąg dosłowny (2.14.5),
  • wynikiem na ekspresja ypeid (5.2.8) lub
  • predefiniowana zmienna func (8.4.1).

Ponadto informacje cppreference „s na kategorie wartość idzie w szczegóły lwartościami:

lwartością jest wyrażeniem, które określa nietymczasowe obiekt lub funkcję trzecich.

następujące wyrażenia są lwartościami:

  • Nazwa zmiennej lub funkcji w zakresie, niezależnie od typu, takie jak std :: cin i std :: endl. Nawet jeśli typ zmiennej jest wartością rvalue , wyrażenie składające się z jej nazwy jest wyrażeniem o wartości l..

  • wywołanie funkcji lub przeciążenia operatora, jeśli ekspresja Function lub przeciążone typu powrotu operatora jest odniesienie lwartość, jak std :: getline (std :: cin, STR) lub std :: cout < < = 1 lub słowo1 słowo2 lub ++ iter

  • wbudowanej preinkrementacja i wstępnie dekrementuj dereference, przypisanie i przyporządkowania związku, indeks (inaczej niż w xvalue array), członek dostępu (z wyjątkiem nie statycznych niereferencyjnych wartości xvalues, element członkowski i niestatyczne funkcje składowe), dostęp do elementu przez wskaźnik do elementu danych, jeśli lewy operand jest wartością l e, przecinek operator, jeśli prawostronny operand jest lwartością, trójskładnikowym warunkowym, jeśli drugi i trzeci operand są lwartościami.

  • Prześlij wyrażenie do typu odniesienia lwartości.

  • String dosłowne

Jednak to wszystko jest bez znaczenia, ponieważ zakres zmian jest propozycja Allow constant evaluation for all non-type template arguments.