Usando-declaración para mover nombre a otro espacio de nombres?
-
29-09-2019 - |
Pregunta
Teniendo en cuenta:
namespace One {
void foo(int x) {
munch(x + 1);
}
};
namespace Two {
// ... see later
}
...
void somewhere() {
using namespace Two;
foo(42);
...
¿hay alguna diferencia entre las dos variantes siguientes:
a)
namespace Two {
void foo(int x) {
munch(x + 1);
}
};
y b)
namespace Two {
using One::foo;
};
EDIT: Es bastante claro que (a) duplica el código que nunca debe ser una idea buena. La cuestión es más acerca de la resolución de sobrecarga etc ... ¿y si hay otros foo
s o munch
es posiblemente en otros espacios de nombres?
Solución
Con una, en realidad son funciones diferentes, pero con b, las dos funciones son idénticas:
assert(&One::foo == &Two::foo);
Esto rara vez tendría importancia; una preocupación más grande está duplicando la lógica.
Otros consejos
En cuanto al uso son equivalentes. En cuanto a código, en el caso a) que está duplicando el código de función foo()
. Es decir, las dos versiones pondrá a disposición la función foo()
dentro Two
, pero el) caso de que una genera el código para foo
dos veces, ya que el compilador no tiene ninguna pista en el descubrimiento de que es la misma función.