質問: "; print_Array_bool(z); cout << '\n'; _getch(); return 0; } ```
回答: `template class Array;` を補って gcc-7.3.0@x86_64-cygwin で試したところ > > > ``` > depr.cpp:17:13: error: ambiguous overload for 'operator=' (operand types are 'Array::BitOfByteRef' and 'Array::BitOfByteRef') > z[1] = y[3];///ここです。 > BoolArray.h:35:19: note: candidate: Array::BitOfByteRef& Array::BitOfByteRef::operator=(bool) > BoolArray.h:24:9: note: candidate: Array::BitOfByteRef& Array::BitOfByteRef::operator=(const Array::BitOfByteRef&) > BoolArray.h:24:9: note: candidate: Array::BitOfByteRef& Array::BitOfByteRef::operator=(Array::BitOfByteRef&&) > > ``` > > となりました。 で。エラーになっている原因は * コピーコンストラクタがコンパイラによって暗黙に作られる場合がある * `operator=` がコンパイラによって暗黙に作られる場合がある * ところがこの例では `BitOfByteRef::operator=` を明示しているので「作られない = deleted 」 * 自前で作った `BitOfByteRef::operator=` が正しく呼べない (暗黙に作られるはずの `operator=` と曖昧になっている) 曖昧さがある以前に現コードはほとんど全く意味が無いです。現コードにおいて `z[1]` は `BitOfByteRef operator[] (int i) { ... }` を呼び出しています。この返却値はコピーされた `BitOfByteRef` 一時オブジェクト、つまり右辺値になっています。この右辺値に対して `operator=` を呼ぼうとしていますが、一時オブジェクト(右辺値)に代入しても意味がないです(即時デストラクトされるため) この `z[1]=y[3];` で何がしたいのか次第で直し方が違うわけですが、どうしたいですか?