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 szerkesztés

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 szerkesztés