C++ c++;三值运算符转换理解

C++ c++;三值运算符转换理解,c++,implicit-conversion,C++,Implicit Conversion,我无法理解这个三元运算符的转换逻辑(这里是一个示例): 64位值被转换为int,如果该值高于int\u MAX,则该值将不正确 该示例打印了三元运算符的一些用法类型,以及表达式的结果类型和结果值。 以下是示例的输出: int Ternary with singletime, > INT_MAX: 18446744071562067968 singletime<unsigned long> singletime w/o ternary, > INT_MAX: 2

我无法理解这个三元运算符的转换逻辑(这里是一个示例):

64位值被转换为int,如果该值高于
int\u MAX
,则该值将不正确

该示例打印了三元运算符的一些用法类型,以及表达式的结果类型和结果值。
以下是示例的输出:

int
Ternary with singletime, > INT_MAX:     18446744071562067968

singletime<unsigned long>
singletime w/o ternary, > INT_MAX:  2147483648

unsigned long
Ternary with uint64_t, > INT_MAX:   2147483648

unsigned long
uint64_t w/o ternary, > INT_MAX:    2147483648

int
Ternary with singletime, <= INT_MAX:    2147483647

singletime<unsigned long>
singletime w/o ternary, <= INT_MAX:     2147483647

unsigned long
Ternary with uint64_t, <= INT_MAX:  2147483647

unsigned long
uint64_t w/o ternary, <= INT_MAX:   2147483647
int
三值单时间>整数最大值:18446744071562067968
一次性
单时间不带三值,大于整数最大值:2147483648
无符号长
带uint64_t的三值,大于INT_MAX:2147483648
无符号长
uint64不带三元,大于整数最大值:2147483648
int
三元,单次,来自标准,5.16

如果第二个和第三个操作数具有不同的类型,并且其中一个具有 (可能是cv限定的)类类型,尝试转换每个 将这些操作数的类型转换为另一个操作数的类型。确定T1类型的操作数表达式E1是否可以转换为 匹配T2类型的操作数表达式E2定义如下:

如果E2为右值,或无法进行上述转换:

否则(即,如果E1或E2具有非类类型,或者如果它们都具有 类类型,但基础类既不相同也不相同 若E1可以,则可以将另一个的基类转换为与E2匹配 隐式转换为表达式E2在以下情况下将具有的类型 E2已转换为右值(如果E2是 (右值)

如果第二个和第三个操作数的类型不同,则 具有(可能是cv限定的)类类型,重载解析用于 确定要应用于操作数的转换(如果有) (13.3.1.2、13.6)

这里,0是右值,它的类型是
int
。编译器将尝试将第一个参数转换为
int
,它会这样做,因为这是可以完成的,这是由于您的转换运算符

getvalue (flag ? singletime_64 : 0, "Ternary with singletime, > INT_MAX");
int
Ternary with singletime, > INT_MAX:     18446744071562067968

singletime<unsigned long>
singletime w/o ternary, > INT_MAX:  2147483648

unsigned long
Ternary with uint64_t, > INT_MAX:   2147483648

unsigned long
uint64_t w/o ternary, > INT_MAX:    2147483648

int
Ternary with singletime, <= INT_MAX:    2147483647

singletime<unsigned long>
singletime w/o ternary, <= INT_MAX:     2147483647

unsigned long
Ternary with uint64_t, <= INT_MAX:  2147483647

unsigned long
uint64_t w/o ternary, <= INT_MAX:   2147483647