Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么动态案例a引用会生成复制构造函数调用_C++_Visual Studio - Fatal编程技术网

C++ 为什么动态案例a引用会生成复制构造函数调用

C++ 为什么动态案例a引用会生成复制构造函数调用,c++,visual-studio,C++,Visual Studio,我尝试将根对象引用强制转换为子类对象引用。我认为这是很正常的逻辑。但出乎意料的是,子类copy constract函数被调用了。在macosx平台中,相同性测试用例执行正确。 为什么?我想我知道原因。可能是visual studio 2015的一个缺陷 class IObject { public: IObject() {} IObject(const IObject &ins) { } virtual ~IObject() {}

我尝试将根对象引用强制转换为子类对象引用。我认为这是很正常的逻辑。但出乎意料的是,子类copy constract函数被调用了。在macosx平台中,相同性测试用例执行正确。 为什么?我想我知道原因。可能是visual studio 2015的一个缺陷

class IObject
{
public:
    IObject()
    {}
    IObject(const IObject &ins)
    {

    }
    virtual ~IObject()
    {}
};

class CObject : public IObject
{
public:
    CObject()
    {}
    CObject(const CObject &ins)
    {
        std::cout << "CObject copy constract function has be call" << std::endl;
    }
    virtual ~CObject()
    {}
};

int main(int argc, _TCHAR* argv[])
{

    CObject *pCObject= new CObject();

    IObject *pIObject = pCObject;

    CObject &objectRef = dynamic_cast<CObject*>(pIObject) == NULL ? throw  std::exception() : dynamic_cast<CObject&>(*pIObject);

    return 0;
}
类IOObject
{
公众:
IObject()
{}
IObject(常量IObject和ins)
{
}
虚拟~IObject()
{}
};
类CObject:公共IObject
{
公众:
CObject()
{}
CObject(const-CObject&ins)
{

你知道这句简单的话

CObject &objectRef = dynamic_cast<CObject&>(*pIObject);

你知道复制构造函数在哪一行被调用吗?@Nicol:我认为三元函数正在计算一个右值,引用通过创建一个临时(MSVC行为,违反标准)绑定到右值@BenVoigt:这是一个长期存在的问题,VS2015对此发出了警告(至少在合理的警告级别上)。我担心的是,如果表达式的计算结果为右值,那么编译器应该会失败并出现错误。这是标准行为,对吗?所以这里还发生了其他事情。另外,抛出表达式的结果到底是什么?因为该类型应该是三元表达式的结果,对吗?它实际上是unc了解此代码是否为标准合法代码。@Nicol:我找到了控制规则,在我的回答中引用了该规则。@Nicol:顺便问一下,您希望编译失败会出现什么错误?
if (dynamic_cast<CObject*>(pIObject) == NULL) throw  std::exception();
CObject &objectRef = dynamic_cast<CObject&>(*pIObject);