当我遇到看起来像这样的代码时,我正在修复视觉工作室警告4456(当地声明&p; 39,隐藏以前的声明)...
CObject* pLine;
for(i)
{
CObject* pLine = pLine = GetObjectPtr(i);
list.Add(pLine)
}
pLine = GetObjectPtr(0);
DoStuff(pLine);
为了清楚起见,我将用1&标记它们。 2
CObject* pLine1 = NULL;
for(i)
{
CObject* pLine2 = pLine? = GetObjectPtr(i);
list.Add(pLine2)
}
pLine1 = GetObjectPtr(0);
DoStuff(pLine1);
我不需要知道如何修复此代码;由于在此循环之后下一次使用pLine是一个集合,因此可以安全地重命名pLine2或删除额外的声明。
我想知道的是,,,在这行代码
CObject* pLine = pLine = GetObjectPtr(i);
哪个pLine是第二个pLine? pLine2是否被声明然后立即使用?或者是运算符=()与pLine1一起运行?
答案 0 :(得分:1)
在
CObject* pLine = pLine = /*...*/;
(新)变量pLine
从=
开始,并开始隐藏外部范围内的变量。
在某些极少数情况下使用自引用可能很有用(但由于对象尚未初始化,因此只能使用它的引用)。
void* p = &p;
SomeNode node(node, weight); // And use only &node in constructor.
检查行为可以
的代码int i;
void* p = &i;
std::cout << &p << std::endl; // value #1
std::cout << p << std::endl; // value #2
std::cout << &i << std::endl; // value #2
{
void* p = &p;
std::cout << &p << std::endl; // value #3
std::cout << p << std::endl; // value #3
}