using namespace - все имена, объявленные в неймспейсе вносятся наружу и считаются ниже видимыми using N::x - обратится к переменной из другого неймспейса в Си не было пространств имён, там всё было в глобальном, но области видимости работали примерно также в неймспейсах нельзя объявлять макросы неймспейсы можно переоткрывать - дополнять если дополнить std namespace, то программа будет IFNDR, но можно дополнять специализациями шаблонов для своих типов
using namespase std; плохо использовать потому что:
- ломает идею неймспейсов
- имена оттуда могут конфликтовать с пользовательскими, например max и distance
namespace {
void f();
}
/* анонимный неймспейс тоже самое, что неймспейс с
сложным именем, а потом сразу using namespace это
сложное имя. функции внутри получаются дефакто
static (internal linkage). хорошая явная замена
static функциям, гарантирующая то, что никто не
сможет сделать extern void f(); */3 смысла using:
- using pii = std::pair<int,int> - вводит алиас типа
- using namespase X; - привносит все имена из X
- using namespase::object - вводит имя в текущий неймспейс
using vi = std::vector<int>; как typedef работает для шаблонов
using’и это не экспрешены, а alias declaration
можно объявлять более локальные переменнные с теми же именами ::x достучаться до глобального х, N::x достучаться до х из неймспейса N
поля у циклов имеют такой же уровень вложенности, как и его тело
One Definition Rule каждая сущность в программе должна быть ровно один раз определена. класс и struct можно определить несколько раз, при условии, что все определения дословно идентичны
- Любая (глобальная) сущность может быть определена лишь однажды.
- Любая локальная сущность может быть определена лишь однажды в своей области видимости. 1 пункт - возможны ошибки линковщика, нарушение 2 пункта - CE без исключений
объявить функцию можно сколько угодно раз, но определить лишь один, иначе redefinition инициализация - придавание значений переменной определение функции - с {} любое определение это объявление
неоднозначность обращения к функции или к переменной это CE. на этапе компиляции происходит выбор по какому адресу начать код выполнять
у перегрузки функции есть 3 этапа при компиляции:
- набор кандидатов (выбор тех, кто виден)
- overloading resolution (из набранных кандидатов выбор лучшего)
- проверка доступа