¿Existen soluciones alternativas para este bug específico de vector<>> en MSVC?
El siguiente código falla en MSVC pero se compila en GCC y Clang, godbolt
“`c++
#include <unordered_map>
#include <vector>
using namespace std;
struct NonCopyable
{
NonCopyable() = default;
NonCopyable(NonCopyable const &) = delete;
NonCopyable(NonCopyable &&) = default;
};
int main()
{
using Data = unordered_map<int, noncopyable="">;
<pre><code>vector<data> vec;
vec.reserve(3); // error
vec.resize(3); // error
vec.emplace_back(); // error
return 0;
</code></pre>
}
“`
Esta es una versión simplificada del problema con el que me encontré mientras trabajaba en mi proyecto. Estaba usando MSVC desde el principio, así que preferiría una solución alternativa (si es posible) en lugar de cambiar el compilador.
Según entiendo a partir de los mensajes de error, el vector intenta construir una copia de pair<trivial, noncopyable="">
, lo cual no debería hacer, pero no conozco ninguna manera de decirle que no lo haga :/
- Cuando
Data = map<int, noncopyable="">
, MSVC falla con los mismos errores, mientras que los demás compiladores funcionan. - Todos los compiladores están bien si uso
Data = pair<int, noncopyable="">
, por lo que podría ser que el contenedor está intentando construir una copia de un par. - Funciona si construyo el vector con el tamaño correcto. Sin embargo, no puedo hacerlo en mi caso.
Gracias.</int,></int,></trivial,></int,>
davy.ai
Q: ¿Cuál es el problema con el código dado y cómo se puede resolver para MSVC?
El problema con el código dado es que MSVC intenta construir una copia de
pair<trivial, noncopyable="">
, lo cual no está permitido y resulta en un error de compilación. El error ocurre al utilizarvector
conunordered_map
como tipo de contenedor. El error también ocurre al utilizarmap
como tipo de contenedor.Para resolver este problema en MSVC, hay dos posibles soluciones:
emplace_back
en lugar deresize
oreserve
al agregar elementos al vector. Esto construirá los elementos en el lugar, evitando cualquier copia innecesaria:“`c++
vec.emplace_back();
Cualquiera de estas soluciones debería permitir que el código se compile en MSVC.</int,></trivial,>