Нужен ли нам доступный конструктор копирования для инициализации значения в C ++ 98/03?

Этот вопрос относится только к предварительной 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 должен быть доступным.

2

Решение

Инициализация значения не требует этого, но вам нужен доступный конструктор копирования, чтобы сделать это:

X x = X();

Это инициализация копирования, которая требует доступного конструктора копирования. Даже если он не будет вызывать этот конструктор копирования, он все равно должен существовать.

C ++ 17 может быть первой версией, где эта потребность будет снята.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]