Как мне объявить std :: pair как друга, чтобы он видел частный ctor по умолчанию - PullRequest
0 голосов
/ 08 ноября 2018

Я использую серию boost (de) для реконструкции классов без общедоступных ctors по умолчанию. Я объявляю частный ctor по умолчанию и объявляю класс доступа boost как друга, и он использует ctor по умолчанию как часть процесса десериализации. Но он не может восстановить std::pair, если я не сделаю общедоступный ctor по умолчанию. Я бы лучше объявил о дружбе, но я не могу понять, как.

Ниже приведен упрощенный пример:

class PrivateDC
{
private:
    friend class PrivateDCFriend;
    friend struct std::pair<int, PrivateDC>;
    PrivateDC() = default;
};
class PrivateDCFriend
{
    void f() const
    {
        PrivateDC a;                  // this works, proves friendship
        std::pair<int, PrivateDC> b;  // gets compile error
    }
};

Ошибка: «нет подходящего конструктора для инициализации 'std :: pair '». Я не получаю сообщение об ошибке, если ctor по умолчанию является общедоступным.
Как я могу объявить std::pair как друга, чтобы это работало?

1 Ответ

0 голосов
/ 08 ноября 2018

Вы не можете,

Конструкция по умолчанию std::pair<T, U> требует, чтобы T и U были DefaultConstructible и PrivateDC - нет, сбой этого требования приводит к тому, что конструктор по умолчанию std::pair исключается из комплект перегрузки.

...