C++: Переменные с одинаковым именем (порядок операций) (Область)

Я исправляю визуальное предупреждение студии 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 объявляется и используется немедленно? Или оператор =() запускается с pLine1?

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
}

демонстрация

Другие вопросы по тегам