Возможные стандартные функции для «использования» - PullRequest
3 голосов
/ 01 апреля 2011

Я знал метод using std::swap, позволяющий через ADL использовать определенные пользователем функции swap, но я не знал, что это следует применять и к некоторым другим функциям.Например, я писал оскорбительно std::abs в коде шаблона, где я должен был использовать что-то вроде:

template <class Int> void f(Int i) {
    using std::abs;
    Int j = abs(i);
    // ...
}

Какую стандартную функцию вы можете придумать, какую из них использовать таким образом?

Примечание: g ++ помещает abs в глобальное пространство имен при включении cstdlib (на самом деле ctsdlib включает stdlib.h (который определяет функцию abs#undef abs ...), что говорит стандарт?

1 Ответ

1 голос
/ 01 апреля 2011

Это стандарт:

3.4.6 Директивы использования и псевдонимы пространства имен
[basic.lookup.udir]
При поискеnamespace-name в директиве using или в определении namespace-alias, рассматриваются только имена пространств имен.

Следовательно, вы можете использовать ключевое слово using для импорта переменных, типов и функций в текущийПространство имен.


РЕДАКТИРОВАТЬ

Вы можете импортировать все что угодно в текущее пространство имен, но вы должны заботиться о разрешении пространства имен, поэтому старайтесь не использовать using в заголовках, но только в исходных файлах.

В идеале, вы не должны использовать это ключевое слово.Я использую его иногда, когда у меня глубоко вложенные пространства имен.

...