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