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

decltype and is_same giving confusing results

本文关键字:结果 is same Decltype      更新时间:2023-10-16

请考虑下面的用例:

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)

感谢您的关注!

简介

当"解引用"—通过std::shared_ptr<...>::operator* —a 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) {
  ...
}

您也可以传递shared_ptr_to_int作为decltype的操作数,然后使用结果作为限定符到达element_type:

if (std::is_same<decltype(shared_ptr_to_int)::element_type, int>::value) {
  ...
}



为什么typeid(...).name()返回相同的名称 ?

当使用引用类型调用typeid时,它将丢弃该类型,并将操作数视为非引用类型(即。它会简单地扔掉&)。

另外值得一提的是,调用typeid(...).name()的结果是实现定义的 —永远不要对返回值太过信任。对于完全不同的类型,函数甚至可能返回相同的名称;(从标准的角度来看)实际上没有任何保证。

进一步阅读:

  • typeid operator - cppreference.com