![]() Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Inline namespace
Inline namespace – это механизм, обеспечивающий поддержку развития библиотек, путем предоставления механизма версионирования. Рассмотрим пример: // file V99.h: inline namespace V99 { void f(int); // лучше, нежели версия V98 void f(double); // новая возможность //... } // file V98.h: namespace V98 { void f(int); // что-то делает //... } // file Mine.h: namespace Mine { #include " V99.h" #include " V98.h" }
Суть в том, что спецификатор inline заставляет объявления во вложенном пространстве имен вести себя так, как будто они объявлены в текущем. Это поведение очень «статичное» и ориентировано на разработчика библиотеки, поскольку спецификатор inline указывается поставщиком пространства имен, принимая при этом решение за пользователя. Пользователь Mine никак не может указать, что он хочет по умолчанию использовать V98 вместо V99. См.:
Операторы явного преобразования В С++98 существуют явные и неявные конструкторы; преобразования, определенные с помощью конструктора со спецификатором explicit могут использоваться только при явном преобразовании, в то время, как другие конструкторы могут использоваться также и в неявных преобразованиях. Например: // " обычный конструктор" определяет неявное преобразование struct S { S(int); }; S s1(1); // ok S s2 = 1; // ok Void f(S); f(1); // ok (но это может привести к неприятным // сюрпризам, что если S – это вектор?) struct E { explicit E(int); }; // явный конструктор E e1(1); // ok E e2 = 1; // ошибка (хотя это обычно является сюрпризом) Void f(E); f(1); // ошибка (защищает от сюрпризов – например, // конструктор std:: vector, принимающий int является явным)
Однако конструктор является не единственным механизмом определения преобразования. Если мы не можем изменить класс, мы можем определить оператор преобразования из другого класса. Например: Забиваем Сайты В ТОП КУВАЛДОЙ - Уникальные возможности от SeoHammer
Каждая ссылка анализируется по трем пакетам оценки: SEO, Трафик и SMM.
SeoHammer делает продвижение сайта прозрачным и простым занятием.
Ссылки, вечные ссылки, статьи, упоминания, пресс-релизы - используйте по максимуму потенциал SeoHammer для продвижения вашего сайта.
Что умеет делать SeoHammer
— Продвижение в один клик, интеллектуальный подбор запросов, покупка самых лучших ссылок с высокой степенью качества у лучших бирж ссылок. — Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта. — Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы). — SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание. SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение struct S { S(int) { } /*... */ }; struct SS { Int m; SS(int x): m(x) { } // поскольку S не содержит конструктор S(SS) operator S() { return S(m); } }; SS ss(1); S s1 = ss; // ok; аналогично неявному конструктору S s2(ss); // ok; аналогично неявному конструктору Void f(S); f(ss); // ok; аналогично явному конструктору
К сожалению, не существует явных (explicit) операторов преобразования (поскольку количество примеров, когда это приводит к неприятностям, значительно меньше). В С++11 этот недосмотр учтен и явные операторы преобразования добавлены в язык. Например: struct S { S(int) { } }; struct SS { Int m; SS(int x): m(x) { } // поскольку S не содержит конструктор S(SS) explicit operator S() { return S(m); } }; SS ss(1); S s1 = ss; // ошибка; как и в случае явного конструктора S s2(ss); // ok; как и в случае явного конструктора
|