Rule-of-five dziwny zapis

0

Spotkałem się na internecie z takim przykładem:

class C {
  C(const C&) = default;               // Copy constructor
  C(C&&) = default;                    // Move constructor
  C& operator=(const C&) & = default;  // Copy assignment operator
  C& operator=(C&&) & = default;       // Move assignment operator
  virtual ~C() { }                     // Destructor
};

Zastanawia mnie konkretnie występowanie znaku & w operator=. Co to oznacza?

7

To taki nowy feature z C++11 bodaj mówiący o tym na jakich wartościach (l-value czy r-value) może zostać wykonany ten operator.
Przykład:

#include <iostream>
using namespace std;

class Foo {
public:
	Foo() = default;
	Foo(const Foo&) = delete;
	Foo& operator=(const Foo&) & { puts("Foo assignment operator."); }
};

class Bar {
public:
	Bar() = default;
	Bar(const Bar&) = delete;
	Bar& operator=(const Bar&) && { puts("Bar assignment operator."); }
};



int main() {
	Foo f1;
	Foo f2;
	f2 = f1;        // działa
	// Foo{} = f1;  // nie działa
	
	Bar b1;
	// b2 = b1;     // nie działa
	Bar{} = b1;     // działa
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1