Могут ли (и могут ли) компиляторы C ++ заменить конструкцию / назначение cpy по умолчанию конструктором копирования?
Нет, компилятору запрещено делать это (при условии, что конструктор по умолчанию)вашего класса достаточно сложен, так что компилятор не может доказать, что его исключение приведет к эквивалентной программе).Любой компилятор, который не соответствует стандарту.
РЕДАКТИРОВАТЬ: следующее решение имеет недостатки!Не используйте его!
Следующее решение скрывает состояние гонки. Если ваша блокировка должна была обеспечить копирование в критическом разделе, то мое «решение» нарушит это предположениепоскольку копирование может (и, вероятно, произойдет) произойти за пределами этого критического раздела.Это только работает, если вы выполняете другую работу.Но в исходном коде мьютекс имеет смысл только в том случае, если само копирование является критическим.
Просто сделайте следующее, чтобы предотвратить создание по умолчанию:
ComplexObject = init(any_params_here);
ComplexObject init(any_params_here) {
RAIILockObject _(obj->mutex);
return obj->org;
}
Благодаря исключению копирования это даже не будетвыполнять ненужные копии, просто one (как в вашем коде, но как прямое копирование, а не как назначение копирования).