c++ c++11 language-lawyer undefined-behavior lvalue-to-rvalue

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.