【发布时间】:2019-06-13 01:35:10
【问题描述】:
我正在制作一个 C++ 库,它严重依赖于 RTTI(可自定义桥接至另一种语言)并且对字符串文字类型非常困惑。
这是我为说明问题所做的一个简单测试:
std::cout << typeid(const char*).name() << std::endl; // PKc
std::cout << std::any("").type().name() << std::endl; // PKc
std::cout << typeid("").name() << std::endl; // A1_c
对我来说,前两个打印出const char* 的类型,但最后一个是数组。
为什么std::any("").type() 和typeid("") 的结果不同?有没有办法获得第一个行为,即使字符串文字的结果一致(我使用类型标识来调用不同的类型处理程序)?
P.S.:测试是在 Ubuntu 19.04 上使用 Clang 版本 8.0.0-3 (tags/RELEASE_800/final) 完成的。
【问题讨论】:
-
""不是const char*,因此它们没有匹配的类型。""是const char[],一个 const char 数组。 -
@Eljay 问题不在于它们是否是不同的类型。这是问题的前提。问题是为什么
std::any("").type()不是数组(A1_c)。 -
补充@Eljay 的评论:第二行(
std::any)是一个指针,因为 char 数组在传递给构造函数时会衰减为指针。 -
@Timo 是通过引用传递的,所以传递时不会衰减。
标签: c++ c++17 rtti string-literals