es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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,>

Tags:  , ,

Answer

  1. Avatar for 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 utilizar vector con unordered_map como tipo de contenedor. El error también ocurre al utilizar map como tipo de contenedor.

    Para resolver este problema en MSVC, hay dos posibles soluciones:

    1. Utilizar emplace_back en lugar de resize o reserve al agregar elementos al vector. Esto construirá los elementos en el lugar, evitando cualquier copia innecesaria:

    “`c++
    vec.emplace_back();


    2. Definir una función hash personalizada para el tipo `NonCopyable` para asegurar su correcto manejo en el contenedor desordenado. Esto requiere proporcionar tanto las funciones `hash` como `operator==`: ```c++ struct NonCopyableHash { size_t operator()(NonCopyable const& nc) const noexcept { return /* algún valor hash */; } }; bool operator==(NonCopyable const& lhs, NonCopyable const& rhs) noexcept { return /* alguna condición de igualdad */; } using Data = unordered_map<int, noncopyable,="" noncopyablehash="">; vector<data> vec; vec.reserve(3); // sin error vec.resize(3); // sin error vec.emplace_back(); // sin error

    Cualquiera de estas soluciones debería permitir que el código se compile en MSVC.</int,></trivial,>

Comments are closed.