Как создать конструктор копирования для класса, имеющего члены данных, запрещающие копирование
Вообщем вопрос в теме. Пример:
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 шт):
Ваша проблема в том, что ваш шаблонный конструктор ни фига не вызывается. А вызывается сгенерированный компилятором конструктор - который, понятно, не работает, потому что мьютекс - не копируемый. Вернее, он даже не генерируется, и вызываться нечему...
Когда вы убираете шаблонность - о, тут уже есть ваш копирующий конструктор, в котором опять же мьютекс создается, но не копируется - вы не сказали компилятору, что его надо копировать, только ваш copyPosible. Вот мьютекс и не копируется, и все выглядит работающим...