Chr*_*ong 2 c++ types decltype
嗨考虑下面的用例:
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");
}
Run Code Online (Sandbox Code Playgroud)
对于我的测试用例,我得到的结果"不一样"
我不确定为什么它不会导致价值成真.有人可以向我解释发生了什么事吗?
PS:我的最终目标是将shared_ptr中存储的类型与另一种类型进行比较(在此测试用例中,此类型为int)
感谢您的关注!
当"解除引用" - 通过std::shared_ptr<...>::operator*- shared_ptr时,结果是引用,这意味着decltype(*shared_ptr_to_int)相当于int&.
一个引用给INT 和INT是不一样的类型,因此你会得到你所描述的行为.
甲解除引用 std::shared_ptr产生一个基准,以便一个实际上可以达到并修改该对象的shared_ptr当前正在处理.
为了修复你的例子,你应该使用std :: remove_reference去除那个(可能是意外的)引用.
if (std::is_same<std::remove_reference<decltype(*shared_ptr_to_int)>::type, int>::value) {
...
}
Run Code Online (Sandbox Code Playgroud)
您也可以shared_ptr_to_int作为decltype的操作数传递,然后使用结果作为限定符来达到element_type:
if (std::is_same<decltype(shared_ptr_to_int)::element_type, int>::value) {
...
}
Run Code Online (Sandbox Code Playgroud)
typeid(...).name()返回相同的名称?当typeid与一类其是调用参考它将舍弃此和治疗操作数,就好像它是一个非参考型(即它将简单地扔掉&).
值得一提的是,调用的结果typeid(...).name()是实现定义的 - 永远不要对返回的值过多信任.该函数甚至可以为完全不同的类型返回相同的名称 - 实际上没有任何保证(从标准的角度来看).
进一步阅读: