c++ - ¿Swap() causa un comportamiento indefinido?
c++11 language-lawyer (2)
Como el valor de M no está definido, esperaría que afectara la llamada para cambiar. Los demonios nasales pueden volar, cuando se llama swap.
Estoy tratando de entender las condiciones en std::swap
de [C ++ 11: utility.swap]. La plantilla se define como
template <typename T> void swap(T &, T &)
(más algunos detalles de noexcept
) y por tener el efecto de "intercambiar los valores almacenados en las dos ubicaciones".
¿El siguiente programa está bien definido?
#include <utility>
int main()
{
int m, n;
std::swap(m, n);
}
Si escribiera el código de intercambio (es decir, int tmp = m; m = n; n = tmp;
), tendría un comportamiento indefinido, ya que intentaría la conversión de lvalue a rvalue en un objeto no inicializado. Pero la función estándar std::swap
no parece venir con ninguna condición impuesta, ni se puede derivar de la especificación de que hay un valor de valor de rvalor y por lo tanto UB.
¿El estándar requiere std::swap
para realizar alguna magia que esté bien definida en objetos sin inicializar?
Para aclarar el punto, considere la función void f(int & n) { n = 25; }
void f(int & n) { n = 25; }
, que nunca tiene un comportamiento indefinido (ya que no lee de n
).
Muy buena pregunta. Sin embargo, yo diría que esto está cubierto por [res.on.arguments] §1:
Cada uno de los siguientes se aplica a todos los argumentos de las funciones definidas en la biblioteca estándar de C ++, a menos que se indique explícitamente lo contrario.
- Si un argumento de una función tiene un valor no válido (como un valor fuera del dominio de la función o un puntero no válido para su uso previsto), el comportamiento no está definido.
Para abordar su inquietud acerca de f(n)
, la función f
de su pregunta no es parte de la biblioteca estándar de C ++ y, por lo tanto, la cláusula anterior no se aplica a ella.