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?

Author: Jarod42, 2008-10-08

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.

 139
Author: Constantin,
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
 86
Author: 1800 INFORMATION,
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

 50
Author: Nemanja Trifunovic,
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.

 10
Author: Fred Larson,
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);
 7
Author: dalle,
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.

 6
Author: Black,
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.

 5
Author: Michael Burr,
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]

 3
Author: Andreas DM,
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
 1
Author: Hitokage,
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