all。问题很快。为什么像下面这样的语句可以用最近的gcc或MSVC编译,而用自定义类型编译却不可能?
const auto& a = isParamFP16 ? 0 : "aaa";
-可能const auto& a = isParamFP16 ? paramFP32 : paramFP16;
-不可能(error C2446: ':': no co nversion from 'const T' to 'const T'
用于MSVC,operands to ?: have different types ‘const param<FP32>’ and ‘const param<FP16>’
用于gcc(
我知道所有类型都应该在编译时解析,但为什么第一个变体有效呢?
谢谢。
使用
const auto& a = isParamFP16 ? 0 : "aaa";
"aaa"
的类型将衰减为const char *
。0
是int
,但它也是const char *
的有效值,因为它是空指针常量。这意味着无论返回哪个值,编译器都会将整个条件运算推断为生成const char *
。
带
const auto& a = isParamFP16 ? paramFP32 : paramFP16;
第一个结果有一个param<FP32>
,第二个结果有param<FP16>
。无法将其中一个转换为另一个,因此会发出编译器错误,因为条件运算符只能生成一个类型。
第一种变体有效,因为整数文本0
是空指针常量,这意味着它可以隐式转换为任何指针类型(产生空指针值(。
因此,0
可以转换为const char*
,并且字符串文字"aaa"
衰减为指针const char*
。类型匹配,因此a
的类型将为char const* const&
。
尝试使用任何其他值,例如1
或一些数学值(例如1-1
(,它都不会编译。
?的最后两个操作数?表达式必须具有相同的类型(隐式转换(,以便在编译时可以推导出整个表达式的类型。在第一种情况下,它们会这样做(指针(。不是第二个。