Scope.
max
- переменная заменит max
- функцию или max
- тип, если она объявлена в более узкой области видимости. Компиляция завершится неудачей, если вы объявите max
-функцию и max
переменную в той же области видимости или введете неоднозначность.
Давайте рассмотрим несколько примеров:
int max(int x, int y);
int max;
int main()
{
max = max(10,4);
}
Это не скомпилируется сразу, потому что у нас есть два разных объявления max
в одной и той же области видимости.
namespace test
{
int max(int x, int y);
}
using namespace test;
int max;
int main()
{
max = max(10, 4);
}
Это также не может быть скомпилировано, потому что оператор using указывает, какой max
вы хотите получить неоднозначный, даже если оба max
находятся в разных областях. Этот случай можно исправить, удалив неоднозначность: ::max = test::max(10, 4);
.
int max(int x, int y);
int main()
{
int max = max(10, 4);
}
Этот случай не выполняется, поскольку int max
находится в более узкой области и заменяет int max(int x, int y)
. Здесь нет двусмысленности; код пытается вызвать int
как функцию, а функция max
больше не видна.
int max(int x, int y);
int main()
{
int max = 42;
}
полностью действительна. max
однозначно, int
и max
не используются в качестве функции.
Примечание: int max = max;
скомпилируется, но max будет инициализирован с его неинициализированным я. Не очень полезно, но я уверен, что есть какой-то странный трюк, который может воспользоваться этим поведением.
Есть немного больше свободы с max
типом.
struct max
{
};
max max;
допустимо, но
struct max
{
};
max max;
max fail;
нет. После max max
, max
является переменной и max
-тип теряется. Избавьтесь от этого, избегайте всегда популярных string string;
и map map
.