C ++: невременная константная ссылка - PullRequest
11 голосов
/ 28 декабря 2010

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

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

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


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

1 Ответ

18 голосов
/ 28 декабря 2010

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

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

    const X* p_;
};

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

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

...