gcc — Интересный случай параметра затенения C ++ (параметр не затенен в блоке if)

Сегодня я неожиданно обнаружил, что следующий код полностью действителен (gcc 4.4.5):

int get_int(const int& i)
{
if(i == 0)
{
int i = 1;
return i;
}
return i;
}

Я действительно удивлен. Если мне придется принять это, то я уверен, что могу сказать, что это имеет смысл, потому что новая переменная находится в своем собственном блоке, поэтому остальная часть внешнего кода все еще может получить доступ к параметру, поэтому параметр на самом деле не затенен. Но это все еще не имеет смысла для меня, почему мы НЕ сделали это недопустимым синтаксисом? Я не вижу преимуществ в том, чтобы допустить это, и на самом деле мне просто нужно было покопаться в ошибке, вызванной этим. Это была длинная функция, и я создал свою собственную переменную, не осознавая, что она имеет то же имя, что и параметр, и через несколько строк кода (тот же блок) есть зависимость от этой самой переменной параметра, и теперь она использует мою версию. и вот идет час моего дня.

У меня есть очень поверхностные знания о компиляторах, так может кто-нибудь объяснить мне полную историю этого поведения? Для сравнения, в Java такой код недопустим (дублирующая переменная).

5

Решение

Если вы спрашиваете, почему C ++ допускает это, ответ прост: для того, чтобы принять действительный C-код.

Это также упрощает правила, позволяя обрабатывать разные значения одного и того же идентификатора в разных областях одинаково, не заботясь о том, являются ли используемые области пространствами имен, классами, функциями или областями блоков.

1

Другие решения

Вы передаете не переменную, а ссылку. Цитировать Бьярне Страуструп в язык программирования C ++ — «Ссылка может использоваться для реализации функции, которая должна изменять значение своего аргумента» с.62

-4

По вопросам рекламы [email protected]