я получаю неожиданное поведение со следующим кодом:оператора преобразования нарезка моего объекта
struct Base
{
Base() {}
virtual ~Base() {}
virtual void foo() const = 0;
protected:
Base(const Base &) {}
};
struct Derived : public Base
{
Derived() {}
Derived(const Derived &other) : Base(other) {}
virtual void foo() const {}
};
struct NewDerived
{
operator const Derived() { return Derived(); }
};
void func(const Base &b)
{
b.foo();
}
int main()
{
func(NewDerived());
return 0;
}
С msvc2008, я получаю эту ошибку компиляции в основном():
error C2248: 'Base::Base' : cannot access protected member declared in class 'Base'
Почему это пытаясь получить доступ к конструктору копирования Base?
Если я создаю конструктор копии базы данных общедоступным, код компилирует и разрезает возвращаемое значение во время выполнения, а вызов функции foo() внутри func() запускает чистую виртуальную функцию с именем error.
Может кто-то пролить немного света?
+1 За рыть в историю;) –
В качестве примечания, почему следующие незначительные изменения в код позволяет ему составить, по крайней мере, в VS: 'Int основного() { сопзИте Base & б (NewDerived()); } ' Любые идеи? – AlexK
@AlexK: Вас поразил [MVP] (http://en.wikipedia.org/wiki/Most_vexing_parse). Попробуйте 'const Base & b ((NewDerived()));' (обратите внимание на дополнительные скобки). –