当我遇到如下所示的代码时,我正在修复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

09-19 05:23