実装 (コンパイラ) がコピー コンストラクターとコピー代入演算子を提供しない状況について、少し混乱しています。
- クラスでコピーctorおよび/またはコピー代入演算子を宣言するとき。
- プライベートコピーctorおよび/またはコピー代入演算子を持つクラスから派生すると言う人もいます。
私は2番目の状況について少し混乱しています.2番目の状況はまさにそうです.
a) 実装では宣言されないため、コンパイル時にエラーが発生します。
または
b) 実装はそれらを宣言および定義しますが、コンパイラ定義の実装が基本クラスのメソッドを見つけようとすると、コンパイル時エラーが発生します。
私は昨日インタビューを受けました、私はその(b)が起こっていると言いましたが、インタビュアーは同意しません、彼は(a)と言いました。
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
したがって、実装はそれを宣言して定義すると思いますが、コンパイラ定義の実装が基本クラスのメソッドを見つけようとすると、コンパイル時エラーが発生します。私が間違っている場合は修正してください。