【发布时间】:2013-10-20 20:46:17
【问题描述】:
我已经使用 GCC 4.8 测试了以下代码,因为我们无法形成对 void 的引用,所以无法编译。
#include <iterator>
int main()
{
std::iterator_traits<void*> test;
}
这是否意味着 void* 不是 iterator ? (这里指的是概念)
编辑:
好的,问题不成立。我实际上要问的是为什么 C++ 需要这样的 void* 行为?是出于安全考虑,即防止人们写坏东西吗?
因为引用 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 的角度来看,它确实有。它是计算机中最小可寻址单元的大小。
【问题讨论】:
-
如果
void*是一个迭代器,你将如何获得下一个void*?void没有大小... -
避免空虚 - 对它有点好感
-
更新了我的回答来回答你的更新:)
-
@DanielFrey 感谢您的更新。向后兼容通常会使事情变得比想象的更困难。