Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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.

См.:

  • Standard 7.3.1 Namespace definition [7]-[9].

 

Операторы явного преобразования

В С++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 является явным)

 

Однако конструктор является не единственным механизмом определения преобразования. Если мы не можем изменить класс, мы можем определить оператор преобразования из другого класса. Например:

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; как и в случае явного конструктора






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.