Tworzenie obiektu w funkcji i przeniesienie własności
Ostatnio zmodyfikowano 2013-12-26 09:40
b00rt00s Temat założony przez niniejszego użytkownika |
Tworzenie obiektu w funkcji i przeniesienie własności » 2013-12-26 02:16:11 Mam taki problem. Mam klasę, której nie można kopiować i potrzebuję, aby funkcja (ew. metoda) tworzyła obiekt i zwracała go. Pomyślałem, że przy okazji tego mógłbym wreszcie zrozumieć referencje do r-wartości. Napisałem taki przykładowy kod: #include <iostream>
class A { public: A() = default; A( A & ) = delete; A( A && ) = delete; void print() { std::cout << "blabla" << std::endl; } }; oraz dwie funkcje: A & make1() { A a; return a; }
A && make2() { A a; return std::move( a ); } a także main: int main( int argc, char * argv[] ) { A & pierwszy = make1(); A && drugi = make2(); pierwszy.print(); drugi.print(); } Na mój gust, to funkcja make1 powinna wywołać crash programu, bo zwraca referencję do obiektu lokalnego. Tak się jednak nie dzieje, kod się kompiluje i wykonuje poprawnie. Zastanawiam się jednak nad funkcją make2. Czy ona jest poprawna? Czy tak mogę tworzyć i przekazywać obiekty? Proszę o pomoc i wyjaśnienie tej kwestii. |
|
Monika90 |
» 2013-12-26 09:40:29 Zwracanie z funkcji referencji do automatycznego obiektu, który za chwilę przestanie istnieć, to jest zawsze błąd, bez względu na to, czy to jest referencja do L-wartości czy do R-wartości. Zachowanie programu jest w takiej sytuacji niezdefiniowane. Nie wiadomo co się stanie, może on wypisać "blabla" albo cokolwiek innego. Zwracaj przez wartość i używaj bezpośredniej inicjalizacji (to działa nawet dla klas co nie mają ani konstruktora kopiującego, ani przenoszącego, choć praktycznych zastosowań to chyba nie ma). A make() { return { }; }
int main( int argc, char * argv[] ) { A && pierwszy = make(); A && drugi = make(); pierwszy.print(); drugi.print(); make().print(); }
|
|
« 1 » |