【发布时间】:2010-12-06 07:08:36
【问题描述】:
问题和这个bug类似
Question about storing array in a std::vector in 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:在函数'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 =字符 [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(); }
我认为这是由于不正确的array-to-pointer-decay.
我的问题是: 语言标准中是否有任何内容阻止在 std::vector 中存储数组? 还是只是那个特殊 GCC 版本中的错误?
我相信这应该可以编译(即 4.2.3 是正确的)。
谢谢 马丁
【问题讨论】:
-
有什么理由不使用 std::string?
-
您是说您的代码在 GCC 4.2.3 中编译和执行正确吗?
-
它仍然可以在那个系统上编译,是的。它似乎有效。
-
@kmarsh:我已经用 std::string 替换了它(从一开始就有);我继承了那段代码,但我不得不承认,我不知道它是非法的(这些天我几乎从不使用原始数组);在得到答案之后,现在应该禁止它似乎很合乎逻辑。而且我不喜欢思考为什么它到目前为止有效以及它是否真的有效......
标签: c++ arrays vector destructor