的參考這是不是C++ 11空調風格的演員和C++的static_cast到指針
我感興趣的是微軟的 CMapStringToOb::GetNextAssoc,第3參數,它具有以下定義:
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閱讀,它提到:
Ç管型是使用(類型)的對象或類型(對象)的類型轉換。投 A C式被定義爲其中第一個成功以下的:
const_cast static_cast (though ignoring access restrictions) static_cast (see above), then const_cast reinterpret_cast reinterpret_cast, then const_cast
Q1的:以上列表中缺少任何東西(例如,用於右值)?
Q2:在這種情況下,將C風格轉換爲C++風格轉換的正確方法是什麼? (好的情況2有效,但是,有沒有更簡潔的一個?)
問題3:C風格如何爲rValue執行操作? (換句話說,請解釋爲什麼好的情況1工作)
您需要使用'reinterpret_cast'作爲引用和指針類型。 – paddy
@paddy:「參考和指針」是指「*&」?換句話說,下面的兩個陳述是否一致? S1:「你需要使用reinterpret_cast作爲引用類型。」 S2:「你需要爲指針類型使用reinterpret_cast。」 – milesma
是的。你有什麼是對指針類型的引用。我只是想爲那些引用或指針使用'reinterpret_cast'。 – paddy