Ricevo strane limiti di comportamento controllo uno std :: membro array con MinGW (GCC 4.7.0) con il seguente codiceProblema con il controllo dei limiti un membro di std :: gamma all'interno di una funzione 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();
}
L'uscita è
0
1
0
2
L'errore sembra essere correlato alla ottimizzazione, in quanto colture solo quando compilato con -O
, ho provato le singole bandiere abilitate da -O
ma non riusciva a restringere il campo oltre. Rendere la funzione non-const risolve anche il problema. Potrebbe essere un bug o mi manchi qualcosa?
* Modifica
ristretto la scelta, sembra un bug nella versione const
di .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';
}
stessa uscita come sopra compilato con -std=c++11 -O
usando MinGW 4.7.0 su Windows XP SP3 e Windows 7 sp1.
* modifica 2
stessa uscita nuovamente
#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 funziona bene. – ForEveR
Sembra decisamente un bug per me. –
Produce per me [un'uscita diversa] (http://ideone.com/ZhIsS) ... – dasblinkenlight