c++ - 是否可以在我的对象上停止 std::addressof?
问题描述
出于某种教育原因,我设法通过将引用运算符重载&
为已删除的成员函数或private
方法来阻止其他人获取我的类对象的地址。但是 C++11 提供了一个新的模板函数std::addressof
,它返回一个对象的地址。所以我也想禁用它,但是我陷入了半解决方案。这是我的代码尝试:
#include "stdafx.h"
#include <memory>
class Foo {
public:
Foo* operator&() = delete; // declared deleted so no one can take my address
friend Foo* addressof(Foo&) = delete; // ok here.
private:
// Foo* operator&() { return nullptr; } // Or I can declare it private which conforms to older versions of C++.
};
int main() {
Foo f{};
// std::cout << &f << std::endl;
// std::cout << addressof(f) << std::endl; // ok
std::cout << std::addressof(f) << std::endl;// Why I can't stop `std::addressof()`?
std::cout << std::endl;
}
如您所见,如果我将addressof
哪个是朋友模板函数调用到我的班级,那么它可以正常工作。但是如果有人调用std::addressof
我的类对象,编译器不会阻止他。
我需要一些方法来阻止std::addressof
我的对象不被调用。
感谢你们。
解决方案
不。
整点是std::addressof
让人们在作者试图使这个变得困难/混淆/尴尬时找到对象的地址。
语言没有提供禁用或禁止它的方法。这是一个特点。
实际上,std::addressof
如果您不介意程序具有未定义的行为,则可以通过专门针对您的类型来伪造它!(说真的,不要这样做……)。
推荐阅读
- google-sheets - 我想从一个单元格中找到一个值,如果找到,则在同一行中打印另一个单元格的内容
- android - Android 中的 Dex 实现是否有空点入口?他们可以在加载时执行吗?
- c# - 如何在 C# 中创建类似模型的模式?
- snowflake-cloud-data-platform - Snowflake 是否跟踪仓库调整大小的值?
- regression - 有没有一种算法可以用来计算拟合线斜率的不确定性?
- pygame - pygame俄罗斯方块制作图像块
- javascript - 为什么脚本不正确地显示对象内容?
- amazon-athena - 返回在一行上满足条件的 ID 的所有行
- r - 在 R 中使用 dplyr 处理回归模型的数据
- javascript - 将重复的代码行移动到 for 循环中