首页 > 解决方案 > 是否可以在我的对象上停止 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我的对象不被调用。

感谢你们。

标签: c++addressof

解决方案


不。

std::addressof让人们在作者试图使这个变得困难/混淆/尴尬时找到对象的地址

语言没有提供禁用或禁止它的方法。这是一个特点。

实际上,std::addressof如果您不介意程序具有未定义的行为,则可以通过专门针对您的类型来伪造它!(说真的,不要这样做……)。


推荐阅读