У меня есть класс, который пользователь использует для взаимодействия с системой. Этот класс использует Pimpl, чтобы скрыть свои внутренние элементы, поэтому его единственный действительный член является ссылкой на реальный, скрытый объект, который выполняет всю работу.Объекты Const со ссылочной семантикой
Поскольку класс имеет ссылочную семантику, он обычно передается по значению, как указатель. Это приводит к проблеме с корректностью const
. Вы можете легко разбить класс класса const
, просто скопировав значение const
в значение не const
. И избежать этого невозможно, чтобы вообще не копировать.
Я хочу, чтобы иметь возможность вернуть const
значения этих параметров, которые сохраняют характер объекта const
. Без Создание нового класса или что-то в этом роде.
В основном я хочу, чтобы предотвратить это от работы:
struct Ref
{
int &t;
Ref(int &_t) : t(_t) {}
};
Ref MakeRef(int &t) { return Ref(t); }
int main()
{
int foo = 5;
const Ref r(foo);
const Ref c(r); //This should be allowed.
Ref other = MakeRef(foo); //This should also be allowed.
Ref bar(r); //This should fail to compile somehow.
return 0;
}
В конце концов, он не в состоянии будет работать, если бы я сделал это непосредственно:
int &MakeRef(int &t) {return t;}
int main()
{
int foo = 5;
const int &r(foo);
const int &c(r); //This compiles.
int &other = MakeRef(foo); //This compiles.
int &bar(r); //This fails to compile.
return 0;
}
Вы можете сделать конструктор копирования закрытым. –
@JonathanPotter: Тогда никто не мог его скопировать по любой причине. –
Как удалить конструктор копирования и создать конструктор, который принимает неконстантные ссылки? – syam