Äußerstes Parsen: Mehrdeutigkeit in C 11 aufdecken
Die „ärgerlichste Parsen“-Mehrdeutigkeit in C 11 tritt auf, wenn einheitliche Initialisierer verwendet werden. wie im folgenden Code gezeigt Snippet:
#include
class Timer
{
public:
Timer() {}
};
int main()
{
auto dv = Timer(); // Ambiguity: Object or function call?
int time_keeper(Timer()); // Ambiguity: Pointer or call?
return 0;
}
Den ersten Ausdruck verstehen (auto dv = Timer())
Im ersten Ausdruck impliziert das Schlüsselwort auto, dass der Typ von dv vom Initialisierer abgeleitet wird auf der rechten Seite des Gleichheitszeichens (=). Der Initialisierer ist ein Aufruf des Timer-Konstruktors ohne Argumente, der ein Timer-Objekt zurückgibt. Daher ist dv ein Objekt vom Typ Timer.
Den zweiten Ausdruck verstehen (int time_keeper(Timer()))
Im zweiten Ausdruck entsteht die Mehrdeutigkeit, weil Der Compiler kann nicht feststellen, ob Timer() ein Funktionsaufruf oder ein per Referenz übergebenes Objekt vom Typ Timer ist.
Da Funktionen jedoch in Zeiger zerfallen, wenn sie als Argumente übergeben werden, ist die Der wahre Typ von time_keeper ist int(Timer(*)()), der die Mehrdeutigkeit zugunsten der Zeiger-zu-Funktions-Interpretation auflöst.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3