W N4296 3,2 [basic.def.odr] P3:Jedna z definicji zasada o ekspresji dostępu członka klasy
zmienna
x
którego nazwa pojawia się jako potencjalnie z wyrażeniaex
jest ODR wykorzystywane przezex
chyba zastosowanie konwersji wartości do rvalue nax
daje stałą ekspresję, która nie wywołuje żadnych nietrywialnych funkcji, a jeślix
jest obiektem,ex
jest elementem zestawu potencjalnych wyników wyrażeniae
, gdzie albo lwartości -to-rvalue jest stosowane doe
, lube
jest odrzuceniem ed-value expression.
Jak wyjaśnić ten akapit? Znalazłem dwa wyjaśnienia.
1 stąd rozłamu "Trying to understand [basic.def.odr]/2 in C++14 (N4140)"
Zróbmy to na etapy: Występowanie zmiennej `x` w wyrażeniu` ex` stanowiącym ODR wykorzystania, chyba że:
- Każda ze
ex
nie jest potencjalnie oceniane lub- Wszystkie poniższe muszą być spełnione:
- „nakładanie konwersję lwartość-to-RValue do
x
daje stały wyrażenia nie odwołuje się żadnych nieoczywiste funkcji”i- "
ex
jest elementem zestawu potencjalnych wynikami wyrażeniee
„i jedną z następujących czynności posiada:
- ” albo konwersja lwartość do RValue nakłada się
e
"- "lub
e
jest wyrażeniem odrzucono wartość"
i 2 z cppreference http://en.cppreference.com/w/cpp/language/definition
variab le
x
w potencjalnie z wyrażeniaex
jest ODR wykorzystywane chyba każdy z następujących warunków:
stosowania lwartość-to-RValue konwersji
x
daje stały wyrażenia nie odwołuje nie- trywialne funkcje
x
przedmiotem i ex jest jednym z możliwych wyników większej ekspresjie
, jeżeli większa ekspresyjny albo ekspresja odrzucono wartość lub konwersji lwartość do RValue
Pierwsza odpowiedź o dwóch zasad jest i, z drugiej jest dowolny. Który jest poprawny?
Proszę podzielić zasady na etapy, aby wyjaśnić ten kod:
struct S { static const int x = 0; };
extern S s;// no definition of s
int i = s.x;// is s odr-used? is x odr-used?
// gcc 5.1.0 is ok
_ Zmienna jest wprowadzana przez deklarację odniesienia inną niż niestatyczny element danych lub ** obiektu ** _. 'x' jest obiektem, więc jest zmienną. – stackcpp
@stackcpp masz rację. Naprawię moją odpowiedź. – ecatmur
@dyp przepraszam, musi być zły dzień. Oczywiście jest to obiekt kontra referencja, a nie obiekt typu klasowego w stosunku do pierwotnego. – ecatmur