01 déc. 2006

Etude du C++ Technical Report 1 - reference_wrapper : errata 2

Où l'on apprend davantage sur le problème soulevé concernant reference_wrapper<>::result_type, dont je m'étais fait l'écho dans un billet précédent.

A ma question concernant ce problème postée sur le newsgroup comp.lang.c++, Pete Becker, auteur du livre __The Standard C++ Library Extensions: a Tutorial and Reference__ et membre du comité de normalisation du C++ m'a répondu en ces termes (traduits):

A et B[1] devrait dériver de unary_function ou binary_function, mais pas des deux. Gardez à l'esprit que les besoins exprimés pour la définition de result_tyoe l'on été pour des raison de compatibilité ascendante avec les types callable et les compilateurs d'aujourd'hui. Les types callable dans le standard courant ont un unique opérateur d'appel de fonction, donc lorsque vous écrivez ce type vous savez exactement combien d'arguments cet opérateur d'appel de fonction prends, donc vous pouvez choisir unary_function ou binary_function de manière appropriée (voir le chapitre 6 de mon livre, "The Standard C++ Library Extensions", pour plus de détails).

La stature de M. Becker et son champ d'activité m'incite à accepter ses dires, tout en notant quand même que si c'est le cas, rien de tel n'est exprimé dans le document de référence - la description du TR1. Il s'agirait alors d'un oubli.

Vous en conviendrez, cela simplifie d'autant le problème: d'un coup, le problème du double héritage disparaît, donc le problème associé de la détermination de result_type disparaît lui aussi.

Au niveau de l'implémentation, qu'est-ce que celà signifie ? Tout simplement que puisque ce cas n'est pas censé être couvert par le TR1, on peut considérer que le choix pris dans l'errata précédent reste un choix suffisamment valide (dans le cas où la classe encapsulée par reference_wrapper<> dérive de unary_function et binary_function, result_type n'est défini que si unary_function::result_type et binary_function::result_type sont identiques). L'autre possibilité est d'interdire ce cas - le choix est fait au niveau de la précompilation.

Notes

[1] dans mon post ayant ammené cette réponse, A et B étaient deux classes, dérivant toutes les deux à la fois de unary_function et binary_function, la seule différence étant que A définissait en outre le type result_type.

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet