我认为,我最后理解你想要的东西,但我仍然不肯定你为什么想要,我怀疑你真的不需要。 如果你告诉我们你的最终目标是什么,我们或许能够告诉你你你真的需要。 尽管如此:
你似乎知道:
Foo* p = 0;
定义为:<代码>p,为无效点,实际上可能或不可能以记名中的笔记为代表。 你们似乎想方设法确保点人所占领的记忆完全为零点,而不是任何比方位的表示。
在这方面,你可以采取两种方式。 最直接和最正确的做法是:
Foo* p;
memset(&p, 0, sizeof(p));
另一种似乎是你对<代码>reinterpret_cast的思考,即:
Foo* p;
int i = 0;
p = reinterpret_cast<Foo*>(i);
直接将<代码>p分配给零的原因并不在于仅将literal0s 解释为指定给点人的无效点。 <代码>i载有数值零,但并非字面零。 以上是错误的,但当点人和愤怒者人数相同时,更好的方法可能是:
Foo* p;
char c[sizeof(p)] = {0};
p = reinterpret_cast<Foo*>(c);
但是,这还不是校正<>,因为使用<代码>reinterpret_cast<>代码/代码>的未明确行为。 当你重新思考你所投的变量的真正类型时。 上文Foo*,因此,这是不明确的行为。 因此,你应使用<代码>memset实现这一点。
您似乎想使用<条码>tdef,这样你就能够拥有一种在设定时自动分配价值0的点值。 不幸的是,这是不可能的。 缩略语 只能说明某种类型,而不是初步价值。 除了设立你自己的智能标识类别来做这项工作外,你可以做的最好工作是,在方便的条件下,例如,在方便的条件下,打上<条码>。
template <typename T> T* zeroPointer() {
T* p;
memset(&p, 0, sizeof(p));
return p;
}
Foo* p = zeroPointer<Foo>();
现在,即便是考虑到所有这一切,这仍然不能给你在所有情况下都想要的东西。 正如全球机制在其评论中指出的,它没有保证在所有平台上以数字表示点数,因此,<代码>p<>/code>的价值在之后可能不是数字零,可能与address<>em>。 0 在系统中,即便是零点。 特定系统甚至不得 行事,如“地址0”。 例如,就特定系统而言,一名协调人可以代表一个包含部分地址和抵消的构件。
最后,我们知道,为了这一价值,你将不得不承受额外的疼痛。 例如:
Foo* p = zeroPointer<Foo>();
if (p == 0) {
// Not reached if NULL is not all-zero bits, since the literal 0 in the
// comparison is interpreted as a null pointer constant
}
您基本上必须逐个检查。 在不援引未经界定的行为的情况下这样做的唯一办法就是:
template <typename T> bool isZero(T& p)
{
char c[sizeof(p)];
memcpy(&c, &p, sizeof(p));
for (int i = 0; i < sizeof(p); ++i) {
if (c[i] != 0) return false;
}
return true;
}
Foo* p = zeroPointer<Foo>();
if (isZero(p)) {
// Always reached
}
这完全是很麻烦的,因为你对这里的措辞重新工作。 这种措辞试图通过提供一种确定无效点的可行方法而有所助益,但是,你想回避这一点,并出于某种原因自行确定所有零轨道。 因此,我相信,无论你最终想要做什么,都可以以某种其他方式做,而这种方式并不涉及打击你重新拟定方案的措辞。