为何T1与T2的typeid相同但实际类型不同?(输出为1 0)
问题原因解析
T1与T2的真实类型差异:
字符串字面量"A"的类型是const char[2],且它属于左值表达式。根据decltype的推导规则,当表达式是左值(非单个标识符)时,decltype会返回该表达式类型的左值引用。所以T1的实际类型是const char(&)[2](对长度为2的const char数组的引用),而T2是直接定义的const char[2](普通数组类型),二者本质是不同类型。typeid判断为相同的原因:
typeid在处理引用类型时会自动忽略引用修饰,直接返回被引用类型的std::type_info对象。也就是说typeid(T1)等价于typeid(const char[2]),和typeid(T2)指向同一个类型信息实例,因此比较结果为真(输出1)。std::is_same_v判断为不同的原因:
std::is_same会严格匹配类型的所有属性,包括引用、const、volatile等修饰符。T1是数组引用类型,T2是数组类型,属于完全不同的类型范畴,所以std::is_same_v<T1,T2>返回假(输出0)。
你可以通过以下代码验证这个结论:
#include <iostream> #include <type_traits> int main() { using T1 = decltype("A"); using T2 = const char[2]; using T3 = const char(&)[2]; std::cout << std::is_same_v<T1,T3> << "\n"; // 输出1,证明T1是数组引用类型 }
内容的提问来源于stack exchange,提问作者Helmut Zeisel
相关产品推荐
相关产品推荐

