Decltype和is_same给出令人困惑的结果
decltype and is_same giving confusing results
请考虑下面的用例:
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
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- Why is UINT32_MAX + 1 = 0?
- C++错误:"error: int aaa::bbb is protected within this context"
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 如果一个字符,比如说"9",我减去"0",我在结果上使用 is 数字,我是真还是假