У меня небольшая путаница в отношении ситуаций, когда реализация (компилятор) не будет предоставлять конструктор копирования и оператор присваивания копии.
- Когда мы объявляем копию ctor и / или оператор присваивания копирования в нашем классе.
- Кто-то говорит, когда мы наследуем класс, у которого есть частная копия ctor и / или оператор присваивания копии.
Меня немного смущает вторая ситуация, точно ли вторая ситуация.
a) Реализация не объявит их для вас, поэтому вы получите ошибку времени компиляции.
OR
b) Реализация объявит и определит их, но когда определенная компилятором реализация попытается найти метод базового класса, мы получим ошибку времени компиляции.
У меня было интервью вчера, я сказал, что это (б), что происходит, но интервьюер не согласен, он говорит, что это (а).
Я попытался скомпилировать следующий код в Microsoft C / C ++ 14.00 и gcc 4.4.5
struct A
{
private:
A& operator = ( const A& );
};
struct B : A
{
};
int main()
{
B b1;
B b2;
b1 = b2;
return 0;
}
Вывод компилятора Microsoft
ctor01.cpp(9) : error C2248: 'A::operator =' : cannot access private member declared in class 'A'
ctor01.cpp(4) : see declaration of 'A::operator ='
ctor01.cpp(2) : see declaration of 'A'
This diagnostic occurred in the compiler generated function 'B &B::operator =(const B &)'
вывод компилятора gcc
Ctor01.cpp: In member function ‘B& B::operator=(const B&)’:
Ctor01.cpp:4: error: ‘A& A::operator=(const A&)’ is private
Ctor01.cpp:8: error: within this context
Ctor01.cpp: In function ‘int main()’:
Ctor01.cpp:15: note: synthesized method ‘B& B::operator=(const B&)’ first required here
Так что я думаю, что реализация объявит и определит его, но когда реализация, определенная компилятором, попытается найти метод базового класса, мы получим ошибку времени компиляции. Поправь меня, если я ошибаюсь.