mybase::operator=
является скрытым автоматически сгенерированным оператором назначения копирования myderived::operator=
.
Вы можете использовать объявление using
, чтобы сделать оператор базового класса видимым в производном классе.
РЕДАКТИРОВАТЬ: добавлен пример для запроса:
template<typename This>
struct mybase
{
This& operator =(const This &other)
{
//__debugbreak(); // The debugger should break here, but doesn't.
return static_cast<This &>(*this);
}
};
struct myderived : mybase<myderived>
{
using mybase<myderived>::operator=;
int x;
};
int main()
{
myderived a = myderived(); // And yes, I know it's redundant...
myderived b = myderived();
a = b;
}
Это прекрасно компилируется с Visual C ++ 10.0 и Comeau Online. Последнее означает на практике, что это хороший стандарт C ++. Однако код не компилируется с MinGW g ++ 4.4.1 (ошибка компилятора).
РЕДАКТИРОВАНИЕ 2: На самом деле, проверяя сейчас, с Visual C ++ 10.0 он компилируется, но оператор базового класса не вызывается. Так что, возможно, G ++ является правильным. using
- это обычно способ ввода оператора присваивания базового класса (или чего-либо еще), но в этом случае он имеет ту же сигнатуру, что и производный класс & rsquo; Скопируйте оператор присваивания, и я пока не знаю, является ли поведение Visual C ++ правильным или нет - ndash; это угловой случай языка.
РЕДАКТИРОВАТЬ 3: Я проверил N3290 (стандартный черновик, идентичный C ++ 11), и он говорит
§12.8 / 18:
Если определение класса явно не объявляет оператор присваивания копии, он объявляется неявно. Если определение класса объявляет конструктор перемещения или оператор присваивания перемещения, неявно объявленный оператор присваивания копии определяется как удаленный; в противном случае он определяется как дефолтный (8.4).
Я лично интерпретирую это как высказывание, что с объявлением using
класс & ldquo; объявляет & rdquo; оператор присваивания копии, и поэтому его не следует генерировать неявно (как это делает Visual C ++ 10.0). Тем не менее, это угловой случай языка. Другие могут интерпретировать это по-разному, и, как отмечено выше, компиляторы отличаются!
Приветствия и hth.,