Можно ли использовать ссылку rvalue в качестве дескриптора pimpl? - PullRequest
2 голосов
/ 27 апреля 2019

Я хочу создать класс с Pimpl (частная реализация). Обычно вы делаете:

class A
{
private:
  class B;
  B* _pimpl = nullptr;
}

и тогда я бы определил его в файле .cpp. Но я должен использовать динамическое распределение. Можно ли вместо этого использовать ссылку на rvalue?

class A
{
public:
  A(); //Constructor to init rvalue reference
private:
  class B;
  B&& _pimpl;
}

А затем в .cpp файле:


class A::B
{
public:
   int C = 3u;
}

//and then the constructor of A:

A::A() : _pimpl(B()) { } //now we should have a fresh b pimpl?

В настоящее время я нахожусь в отпуске, и у меня есть только моя книга по С ++ для справки. Я прочитал о ссылках на rvalue и подумал, что это может сработать. Что вы, ребята, думаете?

1 Ответ

5 голосов
/ 27 апреля 2019

Если под "работой" вы подразумеваете "компиляцию", то конечно.

Но _pimpl(B()) собирается инициализировать _pimpl как ссылку на временную .Ссылки на элементы не продлевают срок службы, поэтому эта конструкция почти сразу же свисает.Поэтому нет, это не сработает.

A unique_ptr<B> - лучший тип для хранения pimpl (по умолчанию).Потребность в динамическом распределении обычно нельзя избежать.Но недостатки могут быть смягчены, если выбрать хороший пользовательский распределитель.

...