繁体   English   中英

字符数组矢量的C ++ GCC 4.3.2错误

[英]C++ GCC 4.3.2 error on vector of char-array

问题与此漏洞类似

关于在C ++中将数组存储在std :: vector中的问题

但出于其他原因(请参见下文)。

对于以下C ++示例程序:

#include <vector>

int main(int c_, char ** v_)
{
        const int LENGTH = 100;

        std::vector<char[LENGTH]> ca_vector;

        return 0;

}

GCC 4.2.3可以干净地编译。 GCC 4.3.2发出以下错误:

/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h: In function ‘void std::_Destroy(_Tp*) [with _Tp = char [100]]’:
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:103:   instantiated from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator = char (*)[100]]’
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:128:   instantiated from ‘void std::_Destroy(_ForwardIterator, _ForwardIterator, std::allocator&) [with _ForwardIterator = char (*)[100], _Tp = char [100]]’
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_vector.h:300:   instantiated from ‘std::vector::~vector() [with _Tp = char [100], _Alloc = std::allocator]’
test.cpp:7:   instantiated from here
/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:88: error: request for member ‘~char [100]’ in ‘* __pointer’, which is of non-class type ‘char [100]’

原因显然是在

include/g++-v4/bits/stl_construct.h

  template
    inline void
    _Destroy(_Tp* __pointer)
    { __pointer->~_Tp(); }

我认为这是由于不正确的数组到指针衰减导致的。

我的问题是: 语言标准中是否有什么阻止数组存储在std :: vector中的? 还是仅仅是该特殊GCC版本中的错误?

我确实认为应该对此进行编译(即4.2.3是正确的)。

谢谢马丁

是的,标准中有些东西停止使用数组使用Craft C ++ 98 Standard

第23节集装箱

存储在这些组件中的对象的类型必须满足CopyConstructible类型(20.1.3)的要求以及Assignabletypes的其他要求。

其中组件是各种容器

20.1.3包括该类型必须具有析构函数的要求。

我认为它是一个必须复制分配和删除元素的向量。 C ++如何知道要复制或删除char []?

不,这是不允许的,就像您所链接的问题中不允许这样做一样(而且我看不出“原因有何不同”)。 这不是两个问题中的一个“错误”。 或者至少不是编译器中的错误。 只是在您的代码中。 ;)

您不能将数组存储在向量中,因为向量要求其元素是可复制构造和可分配的。

最简单的解决方案是:

std::vector<boost::array<LENGTH> > ca_vector;

这样,您不必理会数组/指针的故事。 您是否真的想要这个,是另一个问题。

请让我知道此代码的介意。 您已经知道,向量也是某种数组,您不必给出初始大小。

1D vector  ->  std::vector<char*> ca_vector;
2D vector  ->  std::vector<char*,char*> ca_vector;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM