Подтвердить что ты не робот

С++: ссылка на временную константу

Мне нужно написать класс, конструктор которого принимает постоянную ссылку на объект и сохраняет его локально.

Чтобы избежать большинства распространенных ошибок, которые я могу предвидеть, я бы хотел только принять ссылки на невременные (т.е. ссылки на lvalues).

Как я могу написать функцию, которая принимает постоянные ссылки на не временные только?


Конечно, даже не временные могут выйти из сферы действия и, таким образом, нарушить поведение моего класса, но я считаю, что, запретив временные ссылки, я избежу большинства ошибок.

4b9b3361

Ответ 1

Если вы собираетесь хранить ссылку и использовать ее после завершения конструктора, вероятно, лучше всего, чтобы конструктор взял указатель:

struct C {
    C(const X* p) : p_(p) { }

    const X* p_;
};

Таким образом, в значительной степени гарантируется, что у вас не будет указателя на временный (если только X не делает что-то действительно тупым, например, перегружает унарный &, чтобы вернуть this).

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