首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么void*不是迭代器类型?

为什么void*不是迭代器类型?
EN

Stack Overflow用户
提问于 2013-10-21 04:46:18
回答 1查看 1.8K关注 0票数 17

我已经用GCC 4.8测试了下面的代码,它不能编译,因为我们不能形成对void的引用。

代码语言:javascript
复制
#include <iterator>
int main()
{
    std::iterator_traits<void*> test;
}

这是不是意味着空*不是iterator?(意思是这里的概念)

编辑:

好吧,这个问题的形式是错误的。我真正想问的是,为什么C++需要这样的空*行为?是出于安全考虑,也就是防止人们写出不好的东西吗?

因为虽然延迟void是非法的,但指针算法是:

代码语言:javascript
复制
int main()
{
    std::uint8_t test[] = {1,2,3};
    void * wut = test;
    std::uint8_t * p2 = static_cast<std::uint8_t *>(wut + 1);
    std::cout << std::hex << static_cast<int>(*p2) << std::endl; 
}

所以,即使如你所说,void没有大小,从GCC的角度来看,它是有大小的。它是计算机中最小的可寻址单元的大小。

EN

回答 1

Stack Overflow用户

发布于 2013-10-21 04:48:20

答案很简单,因为您不能取消引用void*。另外,void没有大小,所以你不能移动到下一项。迭代器类型必须是增量的和可解除引用的。

编辑:-

是否出于安全考虑,即防止人们写出不好的东西?

是的,这是为了安全起见。您不能在您的编辑中执行您试图执行的操作。void*只是用来存储地址的,如果你用它来访问任何东西,那么它是不被允许的。

您可以为void * wut编写wut = wut + 1

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19482671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档