Có mã sau đây, tại sao nhiệm vụ đầu tiên không gọi mẫu operator=
trong Foo
, nhưng thứ hai là gì? Điều gì sẽ xảy ra ở đây? Có trình biên dịch tạo ra cho việc chuyển nhượng đầu tiên ngay cả khi người dùng xác định mẫu tồn tại?sử dụng toán tử gán mẫu
#include <iostream>
using namespace std;
struct UberFoo { };
struct Foo : public UberFoo
{
template<typename T> void operator=(const T& v) { cout << "const T&" << endl; Set(v); }
template<typename T> void operator=(T& v) { cout << "T&" << endl; return Set(v); }
virtual void Set(const Foo&) { cout << "Foo::Set(const Foo&)" << endl; }
virtual void Set(const UberFoo&) { cout << "Foo::Set(const UberFoo&)" << endl; }
};
struct Bar : public Foo
{
virtual void Set(const Foo&) { cout << "Bar::Set(const Foo&)" << endl; }
virtual void Set(const UberFoo&) { cout << "Bar::Set(const UberFoo&)" << endl; }
};
int main()
{
Bar a, b;
Foo & pa = a;
const Foo& rb = b;
const UberFoo & urb = b;
cout << "First" << endl;
pa = rb;
cout << endl << "Second" << endl;
pa = urb;
return 0;
}
Tôi biết toán tử gán phải trả về Tự (để tạo chuỗi có thể) nhưng đây không phải là điểm – relaxxx
Có, toán tử gán bản sao luôn được xác định trừ khi xóa một cách rõ ràng. Nếu bạn không xác định một, trình biên dịch sẽ. –