Ответ 1
Я не думаю, что заставить оператора и частного сделать это, есть ли законный способ сделать это.
Нет, потому что &
, который вы используете в сигнатурах функций для передачи по ссылке, не является оператором. Вы говорите либо об адресе оператора (унарного), либо побитового - и оператора (двоичного). Таким образом, это не имеет никакого отношения к передаче по ссылке.
Невозможно запретить передачу по ссылке для типа.
Я сомневаюсь, что ваша мотивация достаточно сильна для этого, и у вас плохое понимание механизма передачи:
Если какая-либо функция пытается получить ее по ссылке, я бы хотел, чтобы она давала ошибку компиляции (в идеале) или ошибку времени выполнения.
Функция либо передает параметр по ссылке, либо по значению. Это было решено путем его заявления, и я думаю, что ваше замешательство проистекает отсюда. Например:
void foo(X x);
принимает значение x
по значению. Нет способа передать его по ссылке. Ни за что. Точно так же:
void foo(X& x)
берет его по ссылке, и он всегда будет.