这不是 C++11

我对微软的第三个参数感兴趣
CMapStringToOb::GetNextAssoc ,其定义如下:

 void GetNextAssoc(
   POSITION& rNextPosition,
   CString& rKey,
   CObject*& rValue
) const;

然后我有以下简单的测试代码:两个好的案例和一个编译器错误的案例。
class CMyObject : public CObject    //in order to use CMapStringToOb
{
public:
    CMyObject(CString name_)
        :name(name_)
    {
    }

    void SayHello()
    {
        TRACE(_T("hello") + name);
    }
    CString name;
};

void main()
{
    CMapStringToOb myMap;
    myMap.SetAt(_T("a"), new CMyObject(_T("aaa")));
    myMap.SetAt(_T("b"), new CMyObject(_T("bbb")));
    myMap.SetAt(_T("c"), new CMyObject(_T("ccc")));

    //good case 1
    POSITION pos = myMap.GetStartPosition();
    while (pos)
    {
        CString s;
        CMyObject* pMine = NULL;
        myMap.GetNextAssoc(pos, s, (CObject*&)pMine);
        if(pMine)
        {
            pMine->SayHello();
        }
    }

    //good case 2
    pos = myMap.GetStartPosition();
    while (pos)
    {
        CString s;
        CObject* pObject = NULL;
        myMap.GetNextAssoc(pos, s, pObject);
        if(pObject)
        {
            CMyObject* pMine = static_cast<CMyObject*>(pObject);
            pMine->SayHello();
        }
    }

    //bad case:
    //can not compile
    //    error C2440: 'static_cast' : cannot convert from 'CMyObject *' to 'CObject *&'
    //        static_cast and safe_cast to reference can only be used for valid initializations or for lvalue casts between related classes

    pos = myMap.GetStartPosition();
    while (pos)
    {
        CString s;
        CMyObject* pMine = NULL;
        myMap.GetNextAssoc(pos, s, static_cast<CObject*&>(pMine));  //compile error
        if(pMine)
        {
            pMine->SayHello();
        }
    }
}

在这种情况下,我试图做的就是找到一种正确的方法来将 C 样式转换替换为 C++ 样式转换。

this 阅读,它提到:



Q1:上面的列表是否遗漏了什么(例如对于 rValue)?

Q2:在这种情况下,将 C 样式转换转换为 C++ 样式转换的正确方法是什么? (好的案例 2 有效,但是,有没有更简洁的案例?)

问题 3:C 风格转换对 rValue 的作用如何? (换句话说,请解释为什么好的案例 1 有效)

最佳答案

您不能在“不相关类型”的引用(或指针)之间使用 static_cast。虽然您可以将 static_castCMyObject* 转换为 CObject* ,但这不是您在这里所做的。在这里,您试图将对指针的引用转换为对另一个指针的引用。并且这两种指针类型没有继承关系。

我喜欢你的“好案例 2”代码——我会用它运行。

有关指针类型的非相关性的更多详细信息,请参见此处:static_cast and reference to pointers

关于c++ - C 样式转换和 C++ static_cast 到指针的引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36928345/

10-12 18:21
查看更多