Как создать конструктор копирования для класса, имеющего члены данных, запрещающие копирование

Вообщем вопрос в теме. Пример:

struct A{
    std::mutex mx;
    int copyPosible;

    A() = default;

    template <typename U> //Этот шаблонный параметр необходим
    A(A const & in) : copyPosible (in.copyPosible) {}
};


int main() {
    A a, b(a);

    return 0;
}

ошибка компиляции:

error: use of deleted function ‘A::A(const A&)’

note: ‘A::A(const A&)’ is implicitly deleted because the default definition would be ill formed: struct A{

error: use of deleted function ‘std::mutex::mutex(const std::mutex&)’

С нешаблонным конструктором копирования код компилируется.
Возможно ли создать шаблонный конструктор копирования в таком случае? Если да, то как? Если нет, то почему?

На сколько мне известно, если указан список инициализации, и указаны не всё члены, то те члены, что не указаны, не инициализируются. Спасибо


Ответы (1 шт):

Автор решения: Harry

Ваша проблема в том, что ваш шаблонный конструктор ни фига не вызывается. А вызывается сгенерированный компилятором конструктор - который, понятно, не работает, потому что мьютекс - не копируемый. Вернее, он даже не генерируется, и вызываться нечему...

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

→ Ссылка