Я играю с автоматической функцией в стандарте С++ 0X, но я смущен, как принято решение типа. Рассмотрим следующий код.
struct Base
{
virtual void f()
{
std::cout << "Base::f" << std::endl;
}
};
struct Derived : public Base
{
virtual void f()
{
std::cout << "Derived::f" << std::endl;
}
};
int main()
{
Base* dp = new Derived;
auto b1 = *dp;
auto& b2 = *dp;
std::cout << typeid(b1).name() << std::endl;
std::cout << typeid(b2).name() << std::endl;
}
Он будет печатать базовые и производные.
Но почему auto&
оценивается как ссылка на Derived, а не ref на Base?
Еще хуже меняет код:
struct Base{};
struct Derived : public Base{};
int main()
{
Base* dp = new Derived;
auto b1 = *dp;
auto& b2 = *dp;
std::cout << typeid(b1).name() << std::endl;
std::cout << typeid(b2).name() << std::endl;
}
возвращает базу для обоих типов. Итак, почему тип зависит от виртуальных функций? Компилятор, который я использую, - VS2010. Может ли кто-нибудь дать мне подсказку, где я могу найти определение этого поведения в стандарте?