#include <iostream>
struct Box
{
Box() { std::cout << "constructor called" << std::endl; }
Box(const Box&) { std::cout << "Copy constructor called" << std::endl; }
Box(Box&&) { std::cout << "Move constructor called" << std::endl; }
void run() const { std::cout << "Run" << std::endl;}
};
int main()
{
Box a(Box());
a.run();
}
(demo)Żaden konstruktorów zwane przechodząc Anonymous obiekt jako argument
W powyższym kodu I był oczekiwany albo Copy Constuctor
lub Move Constructor
nazywać przechodząc anonimowego przedmiotu Box()
jako argument. Ale żaden z nich nie został wezwany. Prawdopodobnie powodem może być copy elision
. Ale nawet konstruktor nie jest wymagany do anonimowego obiektu A()
. W rzeczywistości powyższy kod nie kompiluje się i wywołując kompilator funkcji run()
dał następujący błąd.
a.cpp: In function ‘int main()’:
a.cpp:28:7: error: request for member ‘run’ in ‘a’, which is of non-class type ‘Box(Box (*)())’
a.run();
Więc kiedy wpisujemy Box a(Box())
, co się dzieje? Co powstaje?
Zostałeś ugryziony przez MVP. Uważa, że 'Box a (Box()); jest deklaracją funkcji zwanej' a' zwracającej 'Box'. – Borgleader
@YSC Nie jestem pewien, czy zgadzam się z formatowaniem - wolałem poprzednią wersję. – pingul
Krótkie kody @pingul przyciągają więcej uwagi na SO, a moja edycja nie ma (mam nadzieję) zmiany pierwotnej intencji OP. Ale to zdecydowanie ich wezwanie do wycofania tego. – YSC