这不是 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_cast
从 CMyObject*
转换为 CObject*
,但这不是您在这里所做的。在这里,您试图将对指针的引用转换为对另一个指针的引用。并且这两种指针类型没有继承关系。
我喜欢你的“好案例 2”代码——我会用它运行。
有关指针类型的非相关性的更多详细信息,请参见此处:static_cast and reference to pointers
关于c++ - C 样式转换和 C++ static_cast 到指针的引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36928345/