问题与此错误类似
关于在 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:在函数 '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:从 'void std::_Destroy(_ForwardIterator, _ForwardIterator) [with _ForwardIterator =字符(*)[100]]' /usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:128:从 '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:从 'std::vector::~vector() 实例化 [with _Tp = char [100],_Alloc = std::allocator]' test.cpp:7:从这里实例化 /usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4/bits/stl_construct.h:88:错误:请求“* __pointer”中的成员“~char [100]” ,它是非类类型“char [100]”
原因显然是
include/g++-v4/bits/stl_construct.h 中的这一点
template
inline void
_Destroy(_Tp* __pointer)
{ __pointer->~_Tp(); }
我认为,这是由于不正确的数组到指针衰减而被调用的。
我的问题是: 语言标准中是否有任何内容阻止在 std::vector 中存储数组?或者这只是那个特殊 GCC 版本中的错误?
我确实相信这应该可以编译(即 4.2.3 是正确的)。
谢谢 马丁
是的,标准中有一些内容停止使用数组使用C++98标准草案
第 23 条集装箱
这些组件中存储的对象类型必须满足CopyConstructible的要求 类型 (20.1.3),以及可分配类型的附加要求。
其中组件是各种容器
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;