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. Любая локальная сущность может быть определена лишь однажды в своей области видимости. 1 пункт - возможны ошибки линковщика, нарушение 2 пункта - CE без исключений

объявить функцию можно сколько угодно раз, но определить лишь один, иначе redefinition инициализация - придавание значений переменной определение функции - с {} любое определение это объявление

неоднозначность обращения к функции или к переменной это CE. на этапе компиляции происходит выбор по какому адресу начать код выполнять

у перегрузки функции есть 3 этапа при компиляции:

  • набор кандидатов (выбор тех, кто виден)
  • overloading resolution (из набранных кандидатов выбор лучшего)
  • проверка доступа

memory