The additional overloads are not required to be provided exactly as (A). They only need to be sufficient to ensure that for their first argument num1 and second argument num2:
- If num1 or num2 has type long double, then std::{{{1}}}(num1, num2) has the same effect as std::{{{1}}}(static_cast<long double>(num1),
static_cast<long double>(num2)). - Otherwise, if num1 and/or num2 has type double or an integer type, then std::{{{1}}}(num1, num2) has the same effect as std::{{{1}}}(static_cast<double>(num1),
static_cast<double>(num2)). - Otherwise, if num1 or num2 has type float, then std::{{{1}}}(num1, num2) has the same effect as std::{{{1}}}(static_cast<float>(num1),
static_cast<float>(num2)).
| (until C++23) |
If num1 and num2 have arithmetic types, then std::{{{1}}}(num1, num2) has the same effect as std::{{{1}}}(static_cast</*common-floating-point-type*/>(num1), static_cast</*common-floating-point-type*/>(num2)), where /*common-floating-point-type*/ is the floating-point type with the greatest floating-point conversion rank and greatest floating-point conversion subrank between the types of num1 and num2, arguments of integer type are considered to have the same floating-point conversion rank as double. If no such floating-point type with the greatest rank and subrank exists, then overload resolution does not result in a usable candidate from the overloads provided. | (since C++23) |