由于某种教育原因,我设法通过将引用运算符&重载为已删除的成员函数或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(它是我的类的 friend 模板函数),则它可以正常工作。但是,如果有人在我的类对象上调用std::addressof,则编译器不会阻止他。

我需要一些方法来停止不对我的对象调用std::addressof

感谢你们。

最佳答案

编号

std::addressof 的全部要点是允许人们使用find the address of the object when the author has tried to make this difficult/obfuscated/awkward

该语言没有提供禁用或禁止它的方法。这是一个功能。

实际上,如果您不介意your program having undefined behaviour as a result,则可以通过为您的类型专门设置std::addressof来伪造它! (严重的是,不要这样做…)。

关于c++ - 是否可以在我的对象上停止std::addressof?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54383752/

10-08 23:42