在运行时使用auto键入演绎



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 *0int,但它也是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(,它都不会编译。

?的最后两个操作数?表达式必须具有相同的类型(隐式转换(,以便在编译时可以推导出整个表达式的类型。在第一种情况下,它们会这样做(指针(。不是第二个。

最新更新