Можно ли запретить обращение к объекту

Я хочу сделать обратное к экземплярам класса noncopyable, то есть убедиться, что экземпляры определенного класса могут передаваться только как копия, а не как ссылка. Если какая-либо функция пытается получить ее по ссылке, я бы хотел, чтобы она давала ошибку компиляции (в идеале) или ошибку времени выполнения.

Я не думаю, что создание operator & private будет делать это, есть ли законный способ сделать это.

Ответы

Ответ 1

Я не думаю, что заставить оператора и частного сделать это, есть ли законный способ сделать это.

Нет, потому что &, который вы используете в сигнатурах функций для передачи по ссылке, не является оператором. Вы говорите либо об адресе оператора (унарного), либо побитового - и оператора (двоичного). Таким образом, это не имеет никакого отношения к передаче по ссылке.

Невозможно запретить передачу по ссылке для типа.

Я сомневаюсь, что ваша мотивация достаточно сильна для этого, и у вас плохое понимание механизма передачи:

Если какая-либо функция пытается получить ее по ссылке, я бы хотел, чтобы она давала ошибку компиляции (в идеале) или ошибку времени выполнения.

Функция либо передает параметр по ссылке, либо по значению. Это было решено путем его заявления, и я думаю, что ваше замешательство проистекает отсюда. Например:

void foo(X x);

принимает значение x по значению. Нет способа передать его по ссылке. Ни за что. Точно так же:

void foo(X& x)

берет его по ссылке, и он всегда будет.

Ответ 2

Это невозможно. Любая именованная переменная может привязываться к ссылочной переменной соответствующего типа. Вот как работает язык.

В частности, у вас никогда не будет конструктора копирования с вашим ограничением, поэтому вы не сможете передать объект по значению!