Можно ли остановить std :: addressof на моих объектах? - PullRequest
0 голосов
/ 27 января 2019

По некоторым образовательным причинам мне удалось не дать другим принять адрес объектов моего класса, перегружая ссылочный оператор & как функцию удаленного члена или как метод private.Но C ++ 11 представляет новую шаблонную функцию std::addressof, которая возвращает адрес объекта.Так что я хочу также отключить его, однако я застрял в половину решения.Вот мой код try:

#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, чтобы не вызывать мои объекты.

Спасиборебята.

1 Ответ

0 голосов
/ 27 января 2019

номер

Весь смысл из std::addressof состоит в том, чтобы позволить людям найти адрес объекта, когда автор попытался сделать это трудным / запутанным / неловким .

Язык не может отключить или заблокировать его. Это особенность.

Говоря практически, вы могли бы подделать его, указав std::addressof для своего типа, если вы не возражаете против ваша программа имеет неопределенное поведение в результате ! (Серьезно, не делай этого & hellip;).

...