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

时间:2015-10-11 16:30:02

标签: 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");
}

对于我的测试用例,我得到的结果“不一样”

我不确定为什么它不会导致价值成真。有人可以向我解释发生了什么事吗?

PS:我的最终目标是将shared_ptr中存储的类型与另一种类型进行比较(在此测试用例中,此类型为int)

感谢您的关注!

1 个答案:

答案 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)。

值得一提的是,调用&的结果是实现定义的 - 永远不应该对返回的值过多信任。该函数甚至可以为完全不同的类型返回相同的名称 - 实际上没有任何保证(从标准的角度来看)。

进一步阅读