Tengo el siguiente código que arroja una excepción fuera de límites en la compilación de depuración pero funciona correctamente en la compilación de lanzamiento

typedef unsigned int uint;
std::array<uint, 4> expArray = {51,639,398,744};
unsigned dataArraySize = sizeof(expArray) / sizeof(uint) ;
std::vector<uint> expected ;
std::copy(&expArray[0], &expArray[dataArraySize], back_inserter(expected));
1
sameer karjatkar 29 dic. 2016 a las 15:59

3 respuestas

La mejor respuesta

Para comenzar, simplemente use la biblioteca estándar como se esperaba:

std::vector<uint> expected(begin(expArray), end(expArray));

La triste verdad es que sizeof(std::array<uint, 4>) == sizeof(uint[4]) no tiene que aguantar. Por lo tanto, no puede calcular el tamaño como lo haría para una matriz de estilo c regular.

Si desea que los cambios en su código sean mínimos, use expArray::size() o std::tuple_size<decltype(expArray)>::value

4
StoryTeller - Unslander Monica 29 dic. 2016 a las 13:16

Utilice los métodos begin() y end() en lugar de punteros sin formato. Y si desea obtener el tamaño del contenedor, use el método size().

std::array<uint, 4> expArray = {51,639,398,744};
std::vector<uint> expected;
std::copy(expArray.begin(), expArray.end(), back_inserter(expected));

O método más fácil (que no se adapta a todas las situaciones)

std::vector<uint> expected(std::begin(expArray), std::end(expArray));
1
Kamil Koczurek 29 dic. 2016 a las 13:04

Esta línea está mal:

 unsigned dataArraySize = sizeof(expArray) / sizeof(uint) ;

Debe ser:

std::size_t dataArraySize = std::tuple_size<decltype(expArray)>::value;
1
Paul Evans 29 dic. 2016 a las 13:07