5.17 / 3
Si les deuxième et troisième opérandes ont des types différents et que l'un ou l'autre a un type de classe (éventuellement qualifié par cv), une tentative est effectuée pour convertir chacun de ces opérandes en type de l'autre. Le processus pour déterminer si une expression d'opérande E1 de type T1 peut être convertie pour correspondre à une expression d'opérande E2 de type T2 est défini comme suit:
- Si E2 est une valeur l: E1 peut être converti pour correspondre à E2 si E1 peut être implicitement converti (article 4) au type «référence à T2», sous la contrainte que dans la conversion, la référence doit se lier directement (8.5.3 ) à E1.
- Si E2 est une valeur r, ou si la conversion ci-dessus ne peut pas être effectuée:
- si E1 et E2 ont un type de classe et que les types de classe sous-jacents sont identiques ou que l'un est une classe de base de l'autre: E1 peut être converti pour correspondre à E2 si la classe de T2 est du même type que, ou une classe de base de , la classe de T1 et la qualification cv de T2 est la même qualification cv que la qualification cv de T1, ou une qualification cv supérieure. Si la conversion est appliquée, E1 est remplacé par une valeur r de type T2 qui fait toujours référence à l'objet de classe source d'origine (ou à son sous-objet approprié). [ Remarque: c'est-à-dire qu'aucune copie n'est faite. - note de fin ] en copiant-initialisant un temporaire de type T2 à partir de E1 et en utilisant ce temporaire comme opérande converti.
Sinon (c'est-à-dire, si E1
ou E2 a un type non classe, ou s'ils ont tous les deux des types classe mais les classes sous-jacentes ne sont pas les mêmes ou l'une une classe de base de l'autre): E1 peut être converti pour correspondre à E2 si E1 peut être converti implicitement au type qu'aurait l'expression E2 si E2 était converti en une valeur r (ou le type qu'il a, si E2 est une valeur r).
En utilisant ce processus, il est déterminé si le deuxième opérande peut être converti pour correspondre au troisième opérande, et si le troisième opérande peut être converti pour correspondre au deuxième opérande. Si les deux peuvent être convertis, ou l'un peut être converti mais la conversion est ambiguë, le programme est mal formé. Si aucun des deux ne peut être converti, les opérandes restent inchangés et une vérification supplémentaire est effectuée comme décrit ci-dessous. Si une seule conversion est possible, cette conversion est appliquée à l'opérande choisi et l'opérande converti est utilisé à la place de l'opérande d'origine pour le reste de cette section.
5.17 / 5
Sinon, le résultat est une valeur r. Si les deuxième et troisième opérandes n'ont pas le même type et ont l'un ou l'autre un type de classe (éventuellement qualifié par cv), la résolution de surcharge est utilisée pour déterminer les conversions (le cas échéant) à appliquer aux opérandes (13.3.1.2, 13.6) . Si la résolution de surcharge échoue, le programme est mal formé. Sinon, les conversions ainsi déterminées sont appliquées et les opérandes convertis sont utilisés à la place des opérandes d'origine pour le reste de cette section.