8

我正在使用以下代码检查成员 std::array 与 mingw (gcc 4.7.0) 的奇怪行为界限

#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();
}

输出是

0
1
0
2

该错误似乎与优化有关,因为它仅在使用 编译时才会出现-O,我尝试了启用的各个标志,-O但无法进一步缩小范围。使函数非常量也解决了这个问题。这可能是一个错误还是我错过了什么?

*编辑

缩小范围,看起来像是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';       
}

-std=c++11 -O在 Windows Xp sp3 和 Windows 7 sp1 上使用 mingw 4.7.0编译的输出与上面相同。

*编辑 2

再次输出相同的

#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';     
}
4

1 回答 1

5

这是数组标题的一部分

#ifdef __EXCEPTIONS
  constexpr const_reference
  at(size_type __n) const
  {
return __n < _Nm ? 
       _M_instance[__n] : throw out_of_range(__N("array::at"));
  }
#else
  const_reference
  at(size_type __n) const
  {
if (__n >= _Nm)
  std::__throw_out_of_range(__N("array::at"));
return _M_instance[__n];
  }
#endif

主文件中的 Undef __EXCEPTIONS(或更改#ifdef#ifndef数组)导致正确的输出。我不知道,这是否是正确的解决方案,但它有效。

UPD:我将数组标题中的代码更改为

#ifdef __EXCEPTIONS
  constexpr const_reference
  at(size_type __n) const
  {
return __n < _Nm ? 
       _M_instance[__n] : (throw out_of_range(__N("array::at"))),
                          _M_instance[__n];
   /*return __n < _Nm ? 
            _M_instance[__n] : throw out_of_range(__N("array::at"));*/
  }
#else
  const_reference
  at(size_type __n) const
  {
if (__n >= _Nm)
  std::__throw_out_of_range(__N("array::at"));
return _M_instance[__n];
  }
#endif

现在一切正常

于 2012-08-27T06:02:45.140 回答