C++ 如何禁止获取对象的地址

C++ 如何禁止获取对象的地址,c++,C++,我在玩一个小班的Foo,正在考虑写register Foo-Foo 我知道,要使register真正起作用,您不能使用foo的地址 但这并没有在编译时强制执行。有什么方法可以禁止使用&foo?如果要禁用操作员的地址,您可以写 Foo*运算符&()=delete 在您的类中声明Foo 但这里有一点讽刺:您只能在C++11以后的版本中这样做,register在这些标准中被弃用!无论如何,这只是部分解决方案:您仍然可以使用std::addressof,甚至可以引用cast到char&并获取该地址 在C

我在玩一个小班的
Foo
,正在考虑写
register Foo-Foo

我知道,要使
register
真正起作用,您不能使用
foo
的地址


但这并没有在编译时强制执行。有什么方法可以禁止使用
&foo

如果要禁用操作员的地址,您可以写

Foo*运算符&()=delete

在您的类中声明
Foo

但这里有一点讽刺:您只能在C++11以后的版本中这样做,
register
在这些标准中被弃用!无论如何,这只是部分解决方案:您仍然可以使用
std::addressof
,甚至可以引用cast到
char&
并获取该地址


在C++11之前,您可以声明自己版本的
操作符&
,将其标记为
私有
,而不实现它。编译在大多数情况下都会失败(除非在类的方法中使用
&
),链接时间总是会失败。但是这仍然可以通过引用转换到
char&

来避免,如果要禁用运算符的地址,则可以编写

Foo*运算符&()=delete

在您的类中声明
Foo

但这里有一点讽刺:您只能在C++11以后的版本中这样做,
register
在这些标准中被弃用!无论如何,这只是部分解决方案:您仍然可以使用
std::addressof
,甚至可以引用cast到
char&
并获取该地址


在C++11之前,您可以声明自己版本的
操作符&
,将其标记为
私有
,而不实现它。编译在大多数情况下都会失败(除非在类的方法中使用
&
),链接时间总是会失败。但这仍然可以通过引用转换为
char&

来避免。请注意,
register
已被弃用。这是一个很好的观点。我试图在这里挽回一些尊严。我会澄清这里的措辞,说“声明它是私有的,然后不实施它。”它目前的写法意味着实施。@AndyG:谢谢,所以现在我的评论也适用于您。您还需要专门为类指定std::addressof。请注意,
register
已弃用。Ha。这是一个很好的观点。我试图在这里挽回一些尊严。我会说“声明它是私有的,然后不实现它。”来澄清这里的措辞。它当前的编写方式意味着一个实现。@AndyG:谢谢你,所以我的评论也适用于你。你也会想专门为这个类编写std::addressof。