C++:具有相同名称的变量(操作顺序)(作用域)

C++: Variables with same name (order of operations) (Scope)

我正在修复 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=() 运行 with 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