Если второй или третий операнд имеет тип
void
, [...] В противном случае, если второй и третий операнд являются битовыми полями glvalue той же категории значений, [...]
В противном случае, если второй и третий операнды имеют разные типы и имеют либо (возможно, cv-квалифицированный) тип класса, [...] делается попытка сформировать неявную последовательность преобразования (16.3.3.1) от каждого из этих операндов к типу другого.[...] Предпринимаются попытки сформировать неявную последовательность преобразования из выражения операнда E1
типа T1
в целевой тип, связанный с типом T2
выражения операнда E2
, следующим образом
- Если
E2
является lvalue, типом назначения является «lvalue reference to T2
», при условии ограничения, что в преобразовании ссылка должна привязываться непосредственно к lvalue - Если
E2
- это xvalue, [...] - Если
E2
- это prvalue или если ни одна из приведенных выше последовательностей преобразования не может быть сформирована и хотя бы один из операндов имеет (возможно, cv-квалифицированный) классtype - Если
T1
и T2
относятся к одному и тому же типу класса (игнорируя квалификацию cv), [...] - в противном случае тип назначения - это тип, который
E2
после применения стандартных преобразований lvalue-to-rvalue, array-to-pointer и function-to-pointer.
Используя этот процесс, определяется,последовательность неявных преобразований может быть сформирована изВторой операнд типа цели, определенный для третьего операнда, и наоборот.Если обе последовательности могут быть сформированы, или одна может быть сформирована, но это неоднозначная последовательность преобразования, программа является некорректной.Если последовательность преобразования не может быть сформирована, операнды остаются без изменений, и дальнейшая проверка выполняется, как описано ниже.В противном случае, если может быть сформирована ровно одна последовательность преобразования, это преобразование применяется к выбранному операнду, а преобразованный операнд используется вместо исходного операнда в оставшейся части этого раздела.
Если второйи третьи операнды являются glvalues одной и той же категории значений и имеют один и тот же тип, [...] В противном случае результатом является значение prvalue.Если второй и третий операнды не имеют один и тот же тип и оба имеют (возможно, cv-квалифицированный) тип класса, [...]
Lvalue-to-rvalue (7.1), array-в стандартный указатель преобразования (7.2) и преобразование функции в указатель (7.3) выполняются второй и третий операнды.После этих преобразований должно выполняться одно из следующего:
- Второй и третий операнды имеют одинаковый тип;[...]
- Второй и третий операнды имеют арифметический или перечислимый тип;обычные арифметические преобразования выполняются, чтобы привести их к общему типу, и результат этого типа
[...]