我已经用GCC 4.8测试了下面的代码,它不能编译,因为我们不能形成对void的引用。
#include <iterator>
int main()
{
std::iterator_traits<void*> test;
}
这是不是意味着空*不是iterator?(意思是这里的概念)
编辑:
好吧,这个问题的形式是错误的。我真正想问的是,为什么C++需要这样的空*行为?是出于安全考虑,也就是防止人们写出不好的东西吗?
因为虽然延迟void是非法的,但指针算法是:
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的角度来看,它是有大小的。它是计算机中最小的可寻址单元的大小。
发布于 2013-10-21 04:48:20
答案很简单,因为您不能取消引用void*
。另外,void没有大小,所以你不能移动到下一项。迭代器类型必须是增量的和可解除引用的。
编辑:-
是否出于安全考虑,即防止人们写出不好的东西?
是的,这是为了安全起见。您不能在您的编辑中执行您试图执行的操作。void*
只是用来存储地址的,如果你用它来访问任何东西,那么它是不被允许的。
您可以为void * wut
编写wut = wut + 1
https://stackoverflow.com/questions/19482671
复制相似问题