Pourquoi le code appelle-t-il explicitement une méthode statique via un pointeur null?

J’ai vu du code comme celui-ci dans quelques projets anciens:

class Class { static void Method() {} }; ((Class*)0)->Method(); 

Ce code contient un comportement indéfini car il inclut le déréférencement d’un pointeur null (peu importe ce qui se passe après). Cela n’a vraiment aucun sens – la dissortingbution est là pour fournir le nom du type au compilateur et quiconque a écrit le code ci-dessus aurait pu écrire ceci:

 Class::Method(); 

et ce dernier irait bien.

Pourquoi quelqu’un écrirait l’ancien code? Est-ce un idiome connu de bon vieux temps ou quoi?

    Les fonctions membres statiques ont été ajoutées en C ++ en 1989, dans la version 2.0 du système de langage ATC T ++ (pré-normalisation). Auparavant, le mot-clé static ne pouvait pas être utilisé pour déclarer des fonctions membres statiques, donc les auteurs de code utilisaient des solutions de contournement, principalement celle que vous avez observée lors de l’indexation d’un pointeur null.

    Dans les lectures sélectionnées accompagnant la version 2.0 du système de langage C ++ de AT & T, dans la section 1-22, Stroustrup écrit:

    Il a également été observé que le code non portable, tel que:

     ((X*)0)->f(); 

    a été utilisé pour simuler des fonctions membres statiques. Cette astuce est une bombe à retardement car, tôt ou tard, quelqu’un va rendre virtual un f() et l’appel échouera horriblement car il n’y a pas d’object X à l’adresse zéro. Même si f() n’est pas virtuel, ces appels échoueront sous certaines implémentations de liens dynamics.

    Votre code a été écrit pour comstackr sous Cfront 1.0 ou par une personne qui n’était pas au courant au moment de l’ajout de fonctions membres statiques à la langue.

    L’annotation de la fonction membre avec static est en effet un casse-tête, comme Cheers et hth. – Alf a observé; Cfront 1.0 aurait rejeté ce code avec:

     error: member Method() cannot be static 

    donc ça n’a pas pu être là initialement. Je pense que Potatoswatter est probablement correct; static été ajouté ultérieurement pour documenter et appliquer l’atsortingbut de méthode statique de Method , une fois qu’un compilateur C ++ 2.0 pourrait être garanti, mais sans que le code appelant soit mis à jour. Pour confirmer cela, vous devez interroger le (s) programmeur (s) d’origine ou au moins examiner l’historique du contrôle de source (le cas échéant).