当我遇到如下所示的代码时,我正在修复Visual Studio警告4456(“pLine”的本地声明隐藏了先前的声明)。
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是否被声明然后立即使用?还是Operator =()与pLine1一起运行?
最佳答案
在
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
}
Demo