2017-08-15 15 views
7

Biorąc pod uwagę przypadek, w którym nie ma miejsca na kopiowanie (pre C++ 17).MyClass obj = MyClass(); Czy "MyClass()" odnosi się tutaj do tymczasowego obiektu?

Od cppreference (ponownie, załóżmy, C++ 14):

obiekty tymczasowe są tworzone w następujących sytuacjach:

  • wiążące odniesienie do prvalue
  • Zwracanie prvalue z Konwersja, która tworzy wyrażenie lambda o wartości
  • kopiowaniem inicjalizacji, który wymaga konwersji inicjatora
  • liście inicjalizacji, który konstruuje std :: initializer_list
  • inicjalizacji odniesienia do innego typu zamiennego, ale czy do bitfield.

Wszystkie przypadki wyjątkiem pierwszego wydawać nieistotne, pierwszy z nich wydaje się oznaczać C++ - odniesienia styl wiązania (int &&x = 5; BTW nie rozumiem w takiej sytuacji stwierdzenie, że uzupełnienia tymczasowe są niszczone na koniec pełna ekspresja ..., o której mowa w punkcie 5, nie wydaje się być niszczona na końcu tego oświadczenia).

Tak więc, jak rozumiem, pojęcie obiektu tymczasowego obejmuje tylko te, które są gwarantowane do przechowywania (co nie ma miejsca w mojej sytuacji z powodu możliwej elizacji). Mam rację? Albo co tu nie rozumiem?

okazji ma żadnej różnicy pomiędzy MyClass() i 4 w int x = 4; (lub 2 + 2 w int x = 2 + 2;)? Tak jak być może jestem niepoprawny, a pierwszy NIE odnosi się do obiektu tymczasowego, podczas gdy pozostałe dwa nie ...

+1

Jest liczony na podstawie „nawrócenia, który tworzy prvalue” przypadek. (Tak, to nie wygląda jak konwersja, ale standardowe grupy 'T()', 'T (1)' i 'T (1,2)' razem.) –

+0

@ T.C. tak więc jest coś tymczasowego tylko dla przypadku 'MyClass() '? Nie dla "4", które zaproponowałem jako przykład? W takim razie, jaka jest racjonalność takiej różnicy? Może mógłbyś stworzyć odpowiedź? .. Biorąc pod uwagę, że wydajesz się zaprzeczać istniejącemu już istniejącemu. – ledonter

+0

Czyż 4 nie byłby jeszcze objęty "konwersją, która tworzy wartość pryncypium"? W tym przypadku jest to konwersja z liczby całkowitej na liczbę całkowitą. –

Odpowiedz

1

Standard C++ 14 [1] mówi w 12.2 o obiektach tymczasowych ([class.temporary]):

tymczasowych typu klasy są tworzone w różnych kontekstach: wiążące odniesienie do prvalue ([...]), wracając się prvalue ([...]), konwersja, która tworzy prvalue ([...], 5.4), rzucając wyjątek ([...]), oraz w niektórych inicjalizacjach ([...]).

W MyClass obj = MyClass();, MyClass() jest Jawna konwersja typu w notacji funkcjonalnej, a więc jest to obiekt tymczasowy, ponieważ podlega „nawrócenia, który tworzy prvalue”.

ten nie ma zastosowania do 4 w int x = 4; ponieważ zasada odnosi się do „typy klas”, ale int jest „podstawowym typem”.

Dodatkowo 8,5 inicjatorów ([dcl.init]) wyznacza semantyki typu nieklasowym inicjalizatorów w punkcie (17,8), jak

W przeciwnym przypadku, wartość początkowa przedmiotu inicjowany jest (ewentualnie przekształcony) wartość wyrażenia inicjatora . [...]

natomiast dla typów klas są wywoływane konstruktory (kopiuj). Potrzebujesz więc (tymczasowego) obiektu do skopiowania dla typów klas, ale nie dla "innych" typów.

[1]: faktycznie N4296, ale to nie powinno mieć znaczenie

+0

jesteś świadomy, że w przypadku _possibly convert_ z fragmentu, który cytowałeś, np. 'float x = 4;' (int, aby przekształcić zmienną), czy istnieje tymczasowy obiekt dla oryginalnej int 4? I jest wynikiem konwersji, o której mowa jest oddzielny obiekt od "x"? Nie wiem, jak to działa w tym przypadku .. – ledonter

+0

Nie ma obiektu tymczasowego, ponieważ wartość "4" jest bezpośrednio konwertowana do wartości prvalue "4.f", która jest następnie przypisywana. Nie ma więc potrzeby obiektu typu "int", tylko wartość, więc nie trzeba tworzyć żadnego obiektu tymczasowego. Wynik konwersji jest ponownie wartością prava, nie jest obiektem, więc nie może być tym samym obiektem co '4'. –

+0

Czy mogę zapytać, gdzie w [N4296] (https://wg21.link/n4296) jest napisane, że 'MyClass()' jest konwersją typu jawnego? Wygląda na to, że go nie znalazłem. (Jak wspomniano powyżej, wydaje się raczej konstruktorem, a nie konwersją) – Bigman