Domyślny konstruktor z pustymi nawiasami
Czy Jest jakiś dobry powód, dla którego pusty zestaw okrągłych nawiasów (nawiasów) nie jest prawidłowy do wywołania domyślnego konstruktora w C++?
MyObject object; // ok - default ctor
MyObject object(blah); // ok
MyObject object(); // error
Wydaje mi się, że wpisuję "()" automatycznie za każdym razem. Jest jakiś dobry powód, dla którego to nie jest dozwolone?
9 answers
Najbardziej irytujący parse
Jest to związane z czymś, co jest znane jako"najbardziej irytujący parse C++". Zasadniczo wszystko, co może być interpretowane przez kompilator jako deklaracja funkcji, będzie interpretowane jako deklaracja funkcji.
Inny przykład tego samego problemu:
std::ifstream ifs("file.txt");
std::vector<T> v(std::istream_iterator<T>(ifs), std::istream_iterator<T>());
v
jest interpretowana jako deklaracja funkcji z 2 parametrami.
Obejściem jest dodanie kolejnej pary nawiasów:
std::vector<T> v((std::istream_iterator<T>(ifs)), std::istream_iterator<T>());
Lub, jeśli masz C++11 i lista-inicjalizacja (znana również jako jednolita inicjalizacja) dostępna:
std::vector<T> v{std::istream_iterator<T>{ifs}, std::istream_iterator<T>{}};
Z tym, nie ma możliwości, aby mogła być zinterpretowana jako deklaracja funkcji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-29 23:34:22
Ponieważ jest traktowana jako deklaracja dla funkcji:
int MyFunction(); // clearly a function
MyObject object(); // also a function declaration
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 20:15:41
Ta sama składnia jest używana do deklaracji funkcji - np. funkcja object
, nie pobierając żadnych parametrów i zwracając MyObject
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 20:15:22
Ponieważ kompilator uważa, że jest to deklaracja funkcji, która nie pobiera argumentów i zwraca instancję MyObject.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 20:15:25
Możesz też użyć bardziej wyrazistego sposobu budowy:
MyObject object1 = MyObject();
MyObject object2 = MyObject(object1);
W C++0x pozwala to również na auto
:
auto object1 = MyObject();
auto object2 = MyObject(object1);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-08 08:05:08
Myślę, że kompilator nie wiedziałby, czy to stwierdzenie:
Myobject object ();
Jest wywołaniem konstruktora lub prototypem funkcji deklarującym funkcję o nazwie object z typem zwracanym MyObject bez parametrów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 20:17:11
Jak już wielokrotnie wspominałem, jest to deklaracja. W ten sposób zapewniamy kompatybilność wsteczną. Jeden z wielu obszarów C++, które są głupie/niespójne/bolesne / fałszywe ze względu na jego dziedzictwo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 21:34:19
Od n4296 [dcl.init]: {]}
[uwaga:
ponieważ()
nie jest dozwolone przez składnię dla initializer ,X a();
nie jest deklaracją obiektu klasy X, ale deklaracja funkcji nie pobierającej żadnego argumentu i zwracającej X. form () jest dozwolone w niektórych innych kontekstach inicjalizacji (5.3.4, 5.2.3, 12.6.2).
-uwaga końcowa]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-27 20:09:36
Jak powiedzieli inni, jest to deklaracja funkcji. Od C++11 możesz użyć inicjalizacji nawiasów, jeśli chcesz zobaczyć puste coś , które wyraźnie mówi, że używany jest konstruktor domyślny.
Jedi luke{}; //default constructor
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-19 07:11:57