Этот вопрос относится только к предварительной C ++ 11. Рассмотрим следующий, казалось бы, испорченный код:
struct X
{
X(){} // default user-provided constructor
private:
X(const X&){}
};
int main()
{
X x = X();
}
В соответствии с cppreference.com в pre C ++ 11 будет вызываться ctor по умолчанию:
Эффекты инициализации значения:
1) если T является типом класса по крайней мере с одним предоставленным пользователем конструктором любого вида, вызывается конструктор по умолчанию;
…
Кажется, это подразумевает, что копия ctor не обязательно должна быть доступна. Это правильно или нет? Приведенный выше код не компилируется, поэтому кажется, что копия ctor должен быть доступным.
Инициализация значения не требует этого, но вам нужен доступный конструктор копирования, чтобы сделать это:
X x = X();
Это инициализация копирования, которая требует доступного конструктора копирования. Даже если он не будет вызывать этот конструктор копирования, он все равно должен существовать.
C ++ 17 может быть первой версией, где эта потребность будет снята.
Других решений пока нет …