У меня есть следующий код C ++ в Visual Studio 2005 ...
class Base {};
class Derived : public Base {};
class Other {
public:
Other(const Base& obj) {}
void test() {}
};
int _tmain(int argc, _TCHAR* argv[])
{
Other other(Derived());
other.test();
return 0;
}
... Компиляция завершается неудачно и выдает:
test.cpp(19) : error C2228: left of '.test' must have class/struct/union
Через несколько тестов я определил, что это происходит потому, что объявление переменной "other" интерпретируется как объявление функции (возвращающее Other и принимающее параметр Derived) вместо экземпляра Other, использующего конструктор аргументов. (VS6 находит конструктор и прекрасно его компилирует, но он не очень хорош в стандартном C ++, поэтому я не доверяю ему по сравнению с VS2005)
Если я сделаю ...
Other other(static_cast<Base&>(Derived()));
... или используйте инициализацию копирования, все работает нормально. Но кажется, что он не видит, что экземпляр Derived () является производным от Base сам по себе, или он отдает приоритет объявлению функции вместо попытки полиморфизма для параметра конструктора.
У меня вопрос: это стандартное поведение C ++ или это поведение, специфичное для VS2005? В случае, если ...
Other other(Derived());
... объявить локальный экземпляр в стандарте C ++ или он должен объявить функцию?