Пример:
class Bar;
class Foo
{
public:
Foo(const Bar& bar) : mBar(&bar) {}
/* Other methods use mBar. */
private:
const Bar* mBar;
};
Таким образом, цель состоит в том, чтобы хранить постоянный указатель на некоторый внешний объект, а не хранить копию содержимого внешнего объекта.
- Передача по константной ссылке:
Foo(const Bar& bar)
- Распространенная идиома для передачи объекта в конструктор, многие программисты подумают, что Foo будет хранить копию Bar, а не сам указатель / ссылку.
- Абонент может передать временно. Этого можно избежать, удалив перегрузку r-значения
Foo(const Bar&&) = delete
. Однако это не является надежным решением, так как вы все еще можете переправлять временных товаров через функцию, которая принимает ссылку на констант и возвращает ссылку на констант. Foo afoo(std::min(Bar{}, anotherBar));
например.
- Передача по константному указателю:
Foo(const Bar* bar)
- Необходимо проверить на nullptr, который является проверкой во время выполнения, предпочтительнее использовать механизмы времени компиляции.
- Может все еще заниматься контрабандой во временных:
Foo afoo(&std::min(Bar{}, anotherBar));
Что из перечисленного является предпочтительным и почему? Или есть ли лучшие способы сделать это, которые не страдают от вышеуказанных проблем?