Giriş
Şu koşullarda üretilmez.
Metodun imzası kendine referans dönecek şekilde.
Copy Assignment sol tarafın r-value olmasına izin verir. Elimizde şöyle bir kod olsun.
Bu metodun üretilmemesine sebep olan ikinci madde - yani const üye olması şöyle.
Şu koşullarda üretilmez.
İmzası1. you have explicitly declared a copy-assignment operator (for class X an operator = taking X, X& or const X&) )
2.there is a member in your class that is not assignable (such as a reference, a const object or a class with no or inaccessible assignment operator)
3. (C++11) you have explicitly told the compiler to not generate one using A& operator=(const A&) = delete;
Metodun imzası kendine referans dönecek şekilde.
MyClass& MyClass::operator=(const MyClass &right) { ...
return *this;
}
Sebebi ise şu şekilde kullanım.MyClass p1;
MyClass p2;
MyClass p2;
// ...
p3 = p2 = p1; //assigns all the contents of p1 to p2 and then to p3
Bu kullanım şekli ile şu aynı şeyler.p3.operator=(p2.operator=(p1));
ÖrnekCopy Assignment sol tarafın r-value olmasına izin verir. Elimizde şöyle bir kod olsun.
typedef struct Bar
{
unsigned long low;
long high;
}
Bar;
struct FooStruct
{
private:
Bar bar;
public:
void SetBar(Bar m)
{
bar = m;
}
Bar GetBar()
{
return bar;
}
};
int main()
{
FooStruct f;
Bar m1 = { 1,1 };
Bar m2 = { 2,2 };
f.SetBar(m1);
f.GetBar() = m2; // Here I'd expect an error such as
// "error: lvalue required as left operand of assignment"
}
Açıklaması şöyleThis works because longlong is a class, and as such = is longlong::operator =, the implicitly-defined assignment operator. And you can call member functions on temporaries as long as they're not qualified with & (the default operator = is unqualified).Sağ tarafın l-value olmasını istersek şöyle yaparız.
To restrict the assignment operator to lvalues, you can explicitly default it with an additional ref-qualifier
struct Bar
{
Bar &operator = (Bar const &) & = default;
... ^
};
Const Üye OlmasıBu metodun üretilmemesine sebep olan ikinci madde - yani const üye olması şöyle.
class Foo {
public:
const int a;
Foo(int aa) : a(aa){}};
int main() {
std::vector<Foo> v;
v.emplace_back(1);
v.emplace_back(2);
v.emplace_back(3);
v.emplace_back(4);
std::iter_swap(v.begin() + 1, v.rbegin());
system("pause");
return 0;
}
Hata mesajı olarak şunu alırız.Error C2280 'Foo &Foo::operator =(const Foo &)':
attempting to reference a deleted function
Hiç yorum yok:
Yorum Gönder