Most vexing parse
A most vexing parse (kb. „legbosszantóbb elemzés”) a C++ programozási nyelvben a szintaktikai kétértelműség feloldásának egy ellentmondásos formája. Bizonyos helyzetekben a fordítóprogram nem tud különbséget tenni egy objektum példányának létrehozása és egy függvény deklarálása között, és ebben a helyzetben függvénydeklarációként értelmezi az inkriminált sort. Ez zavarba ejtő és frusztráló lehet a programozó számára, mivel a kód látszólag adott dolgot kellene csináljon, de a C++ nyelvtani szabályai miatt másképp viselkedik. Elkerülése érdekében óvatosnak kell lenni a zárójelek használatánál konstruktorok meghívásában, és meg kell győződni arról, hogy a programozó szándéka egyértelmű a fordítóprogram számára.
Példa
A leggyakoribb forgatókönyv, ahol a most vexing parse előfordul, az üres zárójelpár használata a deklarációnál. Legyen egy ilyen struktúránk:
struct Macska { Macska(bool aranyos = true) { /* kód */ } ... };
Tekintsük a következő eseteket:
Macska cirmos; // Ez helyesen létrehoz egy Macska típusú példányt, az alapértelmezett konstruktort használva az alapértelmezett argumentummal Macska cirmos(); // Ez a "most vexing parse". A programozó számára úgy tűnik, mintha egy példányt hozna létre alapértelmezett argumentummal, // de a fordító valójában egy cirmos nevű függvény prototípusát deklarálja, amely egy Macska objektumot ad vissza Macska cirmos(true); // Ez helyesen létrehoz egy Macska típusú példányt, az alapértelmezett konstruktort használva explicit argumentummal Macska cirmos{}; // Úgynevezett "uniform initialization", a legelső példával ekvivalens, C++11 óta ez a javasolt
Források
- https://www.fluentcpp.com/2018/01/30/most-vexing-parse/
- https://en.cppreference.com/w/cpp/language/direct_initialization