gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:50:10 27 4
gpt4 key购买 nike

请考虑以下用例:

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

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

我不确定为什么它不会导致 value 为真。有人可以向我解释一下这是怎么回事吗?

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

感谢您的关注!

最佳答案

简介

当“取消引用”时 — 通过 std::shared_ptr<...>::operator*shared_ptr 结果是一个reference,这意味着decltype(*shared_ptr_to_int)相当于int& .

reference-to-intint 不是同一类型,因此您会得到您所描述的行为。



阐述

取消引用 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() 的结果是实现定义的 — 永远不要过分信任返回值。该函数甚至可能为完全不同的类型返回相同的名称——实际上没有任何保证(从标准的角度来看)。

进一步阅读:

关于c++ - decltype 和 is_same 给出令人困惑的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33067373/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com