decltype和is_same给出令人困惑的结果

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)

感谢您的关注!

Fil*_*efp 8

介绍

当"解除引用" - 通过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()是实现定义的 - 永远不要对返回的值过多信任.该函数甚至可以为完全不同的类型返回相同的名称 - 实际上没有任何保证(从标准的角度来看).

进一步阅读: