我在 Visual Studio 2005 中有以下 C++ 代码...
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++ 中声明一个本地实例,还是应该声明一个函数?