vectores punteros programacion matrices dinamicos con bidimensionales arreglos aprender c++ c++11 vector stl move

c++ - programacion - ¿Tengo garantizado que los punteros a std:: vector elements son válidos después de mover el vector?



punteros y matrices en c (2)

Este es el tema abierto de LWG 2321 [énfasis mío]

Se debería (generalmente) mover contenedores para conservar iteradores

[...]

[por Stephan T. Lavavej]
23.2.1 [container.requirements.general] / 10 dice que, a menos que se especifique lo contrario, "la función no swap () invalida cualquier referencia, puntero o repetidor que haga referencia a los elementos de los contenedores que se intercambian. [Nota: El iterador end () no se refiere a ningún elemento, por lo que puede ser invalidado. - nota final] ". Sin embargo, los constructores de movimiento y los operadores de asignación de movimiento no reciben garantías de invalidación similares. Las garantías necesitan varias excepciones, por lo que no creo que el lenguaje general como / 11 "A menos que se especifique lo contrario (ya sea explícitamente o definiendo una función en términos de otras funciones), invoque una función miembro contenedor o pase un contenedor como argumento a un La función de biblioteca no invalidará los iteradores ni cambiará los valores de los objetos dentro de ese contenedor. " es aplicable.

[2014-02-13 Issaquah]

Acuerdo general sobre la intención, varias palabras de redacción y párrafos adicionales para golpear.

STL para proporcionar una redacción actualizada. Mover a Abrir.

Propuesta de resolución:

[...]

Ningún constructor [...] de movimiento de un contenedor (excepto el array ) invalida cualquier referencia, puntero o iterador que se refiera a los elementos del contenedor de origen. [ Nota: El iterador end() no se refiere a ningún elemento, por lo que puede ser invalidado. - nota final ]

Entonces, este es un tema abierto, con un acuerdo general sobre su solución básica (el puntero no se invalidará moviéndose). Sin embargo, no está oficialmente aceptado (¿todavía?) Como un defecto. Hasta donde yo sé, todas las implementaciones principales no invalidan los punteros cuando se construyen movimientos, y parece ser una garantía general (implícitamente) proporcionada.

Considerando este ejemplo:

std::vector<int> v1 = { 1, 2, 3 }; const int* i = &v1[1]; std::vector<int> v2(std::move(v1)); std::cout << *i << std::endl;

Aunque en muchas implementaciones de STL esto probablemente funcione, ¿estoy garantizado por el estándar que no se realizan reasignaciones cuando se mueve un std::vector , y el respaldo interno del buffer v2 es el mismo que solía ser el de v1 ? No pude encontrar esta información ni en Internet ni en el estándar en sí.


cppreference.com establece que:

... tiene la opción, pero no se requiere, para mover los recursos que contiene el argumento ...

Parece que std::move solo es una pista para la biblioteca de que es posible una optimización mediante la transferencia de propiedad, pero depende de la biblioteca si se realiza o no esa optimización.

Eso significa que debe suponer que todos los punteros a los elementos se invalidan después del movimiento.