是否可以在我的对象上停止 std::addressof?
Is it possible to stop std::addressof on my objects?
出于某些教育原因,我设法阻止其他人通过将引用运算符 &
重载为已删除的成员函数或 private
方法来获取我的 class 对象的地址.但是 C++11 提出了一个新的模板函数 std::addressof
,它 returns 对象的地址。所以我也想禁用它,但是我陷入了半解决方案。这是我的代码尝试:
#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;
}
如您所见,如果我调用 class 的好友模板函数 addressof
,则它可以正常工作。但是,如果有人在我的 class 对象上调用 std::addressof
,编译器不会阻止他。
我需要一些方法来阻止 std::addressof
不在我的对象上调用。
谢谢大家
没有
std::addressof
is to allow people to 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
来伪造它! (说真的,不要这样做……)。
出于某些教育原因,我设法阻止其他人通过将引用运算符 &
重载为已删除的成员函数或 private
方法来获取我的 class 对象的地址.但是 C++11 提出了一个新的模板函数 std::addressof
,它 returns 对象的地址。所以我也想禁用它,但是我陷入了半解决方案。这是我的代码尝试:
#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;
}
如您所见,如果我调用 class 的好友模板函数 addressof
,则它可以正常工作。但是,如果有人在我的 class 对象上调用 std::addressof
,编译器不会阻止他。
我需要一些方法来阻止 std::addressof
不在我的对象上调用。
谢谢大家
没有
std::addressof
is to allow people to 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
来伪造它! (说真的,不要这样做……)。