Предпочтительный способ передачи константной ссылки / указателя на класс для хранения, а не для копирования упомянутого объекта - PullRequest
0 голосов
/ 20 апреля 2019

Пример:

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));

Что из перечисленного является предпочтительным и почему? Или есть ли лучшие способы сделать это, которые не страдают от вышеуказанных проблем?

1 Ответ

1 голос
/ 20 апреля 2019

Вы можете принять ::std::reference_wrapper<Bar>, он обработает регистр с передачей значения r, а также даст подсказку, что вы собираетесь скопировать оболочку, а не объект.

...