Использование-объявление для перемещения имени в другое пространство имен? - PullRequest
1 голос
/ 06 ноября 2010

Дано:

namespace One {
  void foo(int x) {
    munch(x + 1);
  }
};

namespace Two {
  // ... see later
}

...
void somewhere() {
  using namespace Two;
  foo(42);
  ...

Есть ли разница между следующими двумя вариантами:

а)

namespace Two {
  void foo(int x) {
    munch(x + 1);
  }
};

и б)

namespace Two {
  using One::foo;
};

РЕДАКТИРОВАТЬ: Довольно ясно, что (а) дублирует код, который никогда не должен быть хорошей идеей. Вопрос больше в разрешении перегрузки и т. Д. ... что если в других пространствах имен есть другие foo или munch?

Ответы [ 2 ]

1 голос
/ 06 ноября 2010

С a они на самом деле разные функции, но с b две функции идентичны:

assert(&One::foo == &Two::foo);

Это редко имеет значение;большее беспокойство дублирует логику.

0 голосов
/ 06 ноября 2010

Что касается использования, они эквивалентны. Что касается кода, в случае а) вы дублируете код функции foo(). То есть обе версии сделают доступной функцию foo() внутри Two, но случай а) дважды генерирует код для foo, поскольку компилятор не имеет никаких подсказок, обнаружив, что это одна и та же функция.

...