Me estoy poniendo límites comportamiento extraño de cheques un std :: miembro de matriz con MinGW (gcc 4.7.0) con el siguiente códigoProblema con la comprobación de límites un miembro std :: matriz dentro de una función const
#include <iostream>
#include <array>
class testClass
{
std::array<int, 2> testArray;
public:
testClass();
void func() const;
};
testClass::testClass() : testArray({{1, 2}})
{
}
void testClass::func() const
{
for (int i = 0; i < 2; ++i)
std::cout << testArray.at(i) << '\n' << testArray[i] << '\n';
}
int main()
{
testClass test;
test.func();
}
La salida es
0
1
0
2
El error parece estar relacionado con la optimización, ya que sólo surge cuando se compila con -O
, probé las banderas individuales habilitados por -O
pero no podía reducirlo más. Hacer que la función no const también solucione el problema. ¿Podría ser esto un error o me estoy perdiendo algo?
* Editar
restringido esta definición, se parece a un error en la versión de const
.at()
#include <iostream>
#include <array>
int main()
{
std::array<int, 2> const testArray = {1, 2};
for (int i = 0; i < 2; ++i)
std::cout << testArray.at(i) << '\n' << testArray[i] << '\n';
}
misma salida que el anterior compilado con -std=c++11 -O
utilizando MinGW 4.7.0 en Windows XP SP3 y Windows 7 sp1.
* Editar 2
misma salida de nuevo
#include <iostream>
#include <array>
int main()
{
typedef std::array<int, 2> Tarray;
Tarray test = {1, 2};
for (int i = 0; i < 2; ++i)
std::cout << const_cast<Tarray const*>(&test)->at(i) << '\n' << test.at(i) << '\n';
}
http://liveworkspace.org/code/b0d5b3c7398f7e1a2e36838f23fc943c funciona bien. – ForEveR
Definitivamente me parece un error. –
Produce [una salida diferente] (http://ideone.com/ZhIsS) para mí ... – dasblinkenlight