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
}