您可以考虑以下用例:
int main() {
std::shared_ptr<int> shared_ptr_to_int;
std::cout << typeid(int).name() << std::endl;
std::cout << typeid(decltype(*shared_ptr_to_int)).name() << std::endl;
if (std::is_same<decltype(*shared_ptr_to_int), int>::value) {
std::cout << "is same!\n";
}
else {
std::cout << "not the same!\n";
}
system("pause");
}
对于我的测试用例,我得到的结果“不一样”
我不确定为什么它不会导致价值成真。有人可以向我解释发生了什么事吗?
PS:我的最终目标是将shared_ptr中存储的类型与另一种类型进行比较(在此测试用例中,此类型为int)
感谢您的关注!
答案 0 :(得分:7)
当“解除引用” - 通过std::shared_ptr<...>::operator*
- shared_ptr 时,结果是引用,这意味着decltype(*shared_ptr_to_int)
等同于{{ 1}}。
reference-to-int 和 int 的类型不同,因此您将获得您所描述的行为。
取消引用 int&
会生成引用,以便实际可以访问并修改 shared_ptr 当前的对象处理
为了修复您的示例,您应该使用std::remove_reference删除(可能意外的)引用。
std::shared_ptr
您也可以将if (std::is_same<std::remove_reference<decltype(*shared_ptr_to_int)>::type, int>::value) {
...
}
作为 decltype 的操作数传递,然后使用结果作为限定符进入shared_ptr_to_int
:
element_type
if (std::is_same<decltype(shared_ptr_to_int)::element_type, int>::value) {
...
}
为两者返回相同的名称?当使用引用类型调用typeid(...).name()
时,它会丢弃此内容并将操作数视为非操作数引用类型(即它只会丢弃typeid
)。
值得一提的是,调用&
的结果是实现定义的 - 永远不应该对返回的值过多信任。该函数甚至可以为完全不同的类型返回相同的名称 - 实际上没有任何保证(从标准的角度来看)。
进一步阅读: