используя декларациюusing std::swap
не скрывает функцию, которые вы объявившая поменять HasPtr
и Foo
. Он приводит имя swap
в пространство имен std
в декларативную область. При этом std::swap
может принять участие в разрешении перегрузки.
От C++ 11 стандарта на:
7.3.3 использования декларации
1. использование декларации вводит имя в декларативную область, в которой с помощью декларации появляется.
с использованием декларирование:
using typename
неавтоматическоговложенного именем спецификатор неквалифицированного-ID;
using ::
unqualified-id;
Имени элемента, указанное в с использованием декларации- объявляются в декларативной области, в которой использовании декларации появляется. [Примечание: Указано только указанное имя; указывая имя перечисления в декларации с использованием декларации, не объявляет ее счетчики в декларативной области с использованием декларации. -end note] Если в заявке с использованием декларации указан конструктор (3.4.3.1), он неявно объявляет набор конструкторов в классе, в котором появляется с использованием декларации (12.9); в противном случае имя, указанное в с использованием декларации, является синонимом имени какого-либо объекта, объявленного в другом месте.
В вашем случае, у вас есть:
void swap(Foo &lhs, Foo &rhs)
{
using std::swap;
swap(lhs.h, rhs.h);
}
using std::swap;
декларация вводит имя swap
из std
пространства имен в декларативной области, которая является органом функции swap(Foo&, Foo&)
. Имя swap
из глобального пространства имен по-прежнему доступно в теле функции.
Если то, что вы разместили, является полнотой функции, тогда вам не требуется декларация using std::swap
. Вы можете получить с просто:
void swap(Foo &lhs, Foo &rhs)
{
swap(lhs.h, rhs.h);
}
так swap(HasPtr &lhs, HasPtr &rhs)
виден из функции.
Теперь ознакомьтесь с приведенным ниже примером.
struct Bar {};
void swap(Bar& lhs, Bar& rhs)
{
}
struct Foo
{
int a;
Bar b;
};
void swap(Foo& lhs, Foo& rhs)
{
swap(lhs.a, rhs.a); // A problem
swap(lhs.b, rhs.b);
}
линия отмечена A problem
является проблемой, так как не существует функции с именем swap
, который может работать с двумя объектами типа int&
в качестве аргумента. Вы можете исправить это с помощью одного из следующих методов:
Использование std::swap
явно.
void swap(Foo& lhs, Foo& rhs)
{
std::swap(lhs.a, rhs.a);
swap(lhs.b, rhs.b);
}
Введем std::swap
в функции.
void swap(Foo& lhs, Foo& rhs)
{
using std::swap;
swap(lhs.a, rhs.a);
swap(lhs.b, rhs.b);
}
потому что 'using' не влияет на это –