今日、理解できないコードに出くわしました。次の例を検討してください。
#include <iostream>
#include <string>
class A
{
public:
template <class Type>
Type& operator=(Type&& theOther)
{
text = std::forward<Type>(theOther).text;
return *this;
}
private:
std::string text;
};
class B
{
public:
B& operator=(B&& theOther)
{
text = std::forward<B>(theOther).text;
return *this;
}
private:
std::string text;
};
int main()
{
A a1;
A a2;
a2 = a1;
B b1;
B b2;
b2 = b1;
return 0;
}
コンパイル時に、MinGW-w64/g++ 10.2 は次のように述べています。
..\src\Main.cpp: In function 'int main()':
..\src\Main.cpp:41:7: error: use of deleted function 'B& B::operator=(const B&)'
41 | b2 = b1;
| ^~
..\src\Main.cpp:19:7: note: 'B& B::operator=(const B&)' is implicitly declared as deleted because 'B' declares a move constructor or move assignment operator
19 | class B
| ^
mingw32-make: *** [Makefile:419: Main.o] Error 1
エラーメッセージを完全に理解しています。しかし、 class で同じメッセージが表示されない理由がわかりませんA
。テンプレート化された移動代入演算子も移動代入演算子ではありませんか? では、なぜコピー代入演算子が削除されないのでしょうか? これはよく書かれたコードですか?