C ++ GCC 4.3.2误差对char阵列的矢量(C++ GCC 4.3.2 error on

2019-10-17 20:55发布

这是问题这个bug相似

有关存储阵列中的一个std ::矢量用C ++问题

但出于不同的原因(见下文)。

在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]’

究其原因显然是该位

  包括/克++  -  V4 /比特/ stl_construct.h 

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

这就是所谓,我认为,由于不正确的阵列到指针衰变。

我的问题是: 有没有什么语言标准防止阵列存储在标准::载体? 或只是在那个特殊版本的编译错误?

我相信,这应该编译(即4.2.3是正确的)。

由于马丁

Answer 1:

是的,有一些是在使用数组使用标准停止C ++ 98标准草案

第23个集装箱

存储在这些部件的对象的类型必须满足复制构造类型(20.1.3)和Assignabletypes的附加要求的要求。

其中组分是各种容器

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

我认为它是一个载体具有复制分配和删除元素。 如何c + +知道复制或删除一个char []?



Answer 2:

不,这是不允许的,就像它不是在您链接到的问题允许的(我不看怎么样“的原因是不同的”)。 这不是在任的两个问题一个“错误”。 或者至少,在编译器不是一个bug。 只是在你的代码。 ;)

你不能存储在一个向量数组,因为一个向量需要它的元素是拷贝构造和分配。



Answer 3:

要做到这一点,最简单的解决方法是:

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

这样,您就不必与阵列/指针故事打扰。 无论你是真的想这样,是另外一个问题。



Answer 4:

请让我知道这个代码的想法。 你已经知道,载体也有一些类型的数组,和你没有给初始大小。

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


文章来源: C++ GCC 4.3.2 error on vector of char-array