Ponieważ P0593 Domniemane tworzenie obiektów do manipulacji obiektami na niskim poziomie zostało zaakceptowane, obiekty mogą być teraz tworzone niejawnie w C ++ 20.
W szczególności sformułowanie wprowadzone we wniosku pozwala niektórym operacjom (np. std::malloc
) Automatycznie tworzyć i uruchamiać okres istnienia obiektów określonych typów, tak zwanych typów niejawnych , jeśli wprowadzenie takich obiektów spowodowałoby, że program o innym niezdefiniowanym zachowaniu miałby określone zachowanie. Zobacz [przedmiot wstępny] / 10 .
W wersji roboczej stwierdza się teraz, że jeśli istnieje wiele zestawów takich obiektów, które mogłyby zostać utworzone pośrednio w celu nadania programowi określonego zachowania, nie jest określone, który z tych zestawów zostanie utworzony. (Wydaje się, że odpowiednie zdanie nie występuje w ostatniej poprawce wniosku, do której mogłem uzyskać dostęp, R5, ale jest w projekcie zatwierdzenia.)
Czy istnieje program, dla którego można zaobserwować ten wybór niejawnie utworzonego zestawu obiektów? Innymi słowy, czy istnieje program o zdefiniowanym, ale nieokreślonym zachowaniu dzięki tej nowej regule, tak że można na podstawie danych wyjściowych wywnioskować, które zestawy typów niejawnych obiektów (z więcej niż jednego możliwego) zostały utworzone?
A może to zdanie miało jedynie na celu wyjaśnienie wykonania programu na abstrakcyjnej maszynie (bez zauważalnego wpływu)?
źródło
std::malloc
), W przeciwnym razie występują problemy z definicją rekurencyjnie w zależności od przyszłości.Odpowiedzi:
Weźmy przykład ze standardu i zmieńmy go trochę:
Wcześniej istniał tylko jeden zestaw prawidłowych obiektów, które można było utworzyć pośrednio w tym magazynie - musiał to być dokładnie jeden
X
. Ale teraz mamy pamięć dla dwóchX
sekund, ale piszemy tylko do jednego z nich i nic w tym programie nigdy nie dotyka reszty bajtów. Istnieje więc wiele różnych zestawów obiektów, które można niejawnie utworzyć - może dwaX
s, możeX
i dwaint
, możeX
i osiemchar
, ...Nie można zaobserwować, który zestaw jest tworzony, ponieważ gdyby były jakieś rzeczywiste obserwacje, ograniczyłoby to możliwości tylko do tych zbiorów, które były ważne. Gdybyśmy coś takiego zrobili,
p[1]->a = 3
wówczas wszechświat możliwości zawaliłby się do jednego z dwomaX
s.Innymi słowy, wiele zestawów niejawnie utworzonych obiektów jest prawdopodobnie tylko wtedy, gdy w programie nie ma wystarczającej liczby obserwacji, aby odróżnić ich ważność. Gdyby istniał sposób na rozróżnienie, to z definicji nie wszystkie byłyby ważne.
źródło
char
,unsigned char
lubstd::byte
? Wydaje mi się, że może istnieć także obiekt dowolnego typu, który można skopiować.X
obiektem.