станд.:: суд является глобальным потоковым объектом, обеспеченным библиотекой стандарта C++ для записи в поток стандартного вывода.
Для более общих вопросов о std::ostream
используйте теги ostream или iostream.
Bjarne Stroustrup, создатель C++, объясняет это cout
объявлен "видением", и "c" обозначает "символ".
Ковариантность, контравариантность и инвариантность описывают, как существующая иерархия наследования типа изменяется при подвергании некоторому преобразованию (такому как использование в дженериках). Если преобразование сохраняет упорядочивание исходной иерархии, это является "ковариантным". Если это инвертирует его, это - "контравариант". Если это повреждает его, это является "инвариантным".
Скажем, то, что класс P (родитель) наследован классом C (ребенок).
Мы можем обозначить этот факт как: P> C.
Неофициально, P "больше", чем C, так как он "содержит" все возможные экземпляры C, но может также содержать некоторые другие экземпляры, которые не являются C. Ребенок всегда является родителем, но не обязательно наоборот.
Скажем, то, что существует универсальный тип G, который имеет единственный универсальный параметр T, обозначенный: G {T}.
Таким образом, различие является свойством преобразования (в этом случае: универсальный параметр T G), не исходная иерархия типа (P и C).
Универсальный параметр T IEnumerable<out T>
является ковариантным (как обозначено ключевым словом), означая, что можно "забыть", что набор содержит Cs, и просто рассматривайте его, как будто это содержит ps. Например:
IEnumerable<C> ec = ...; IEnumerable<P> ep = ec;
Универсальный параметр T Action<in T>
контравариант (как обозначено "в" ключевом слове), означая, что действие, которое принимает P, может также принять C. Например:
Action<P> ap = ...; Action<C> ac = ap;
Универсальный параметр T является контравариантным и универсальным параметром, в котором TResult является ковариантным Func<in T, out TResult>
. Каждый универсальный параметр считают различным "преобразованием" с его собственным различием. Это позволяет Вам написать код как это:
Func<P, C> fpc = ...; Func<C, P> fcp = fpc;
И наконец, универсальный параметр T IList<T>
считается инвариантным, таким образом, IList<P>
и IList<C>
считаются несвязанными типами (нет никакой совместимости присвоения ни в одном направлении).
Использование тега