我无法再将 char[M][N] 类型分配给 gcc 4.9 上的 std::vector
I can no longer assign char[M][N] types into a std::vector on gcc 4.9
在升级Ubuntu之前,我一直在使用gcc 4.8,现在我有gcc-4.9.1-16。过去在没有警告的情况下编译并且运行良好的代码现在不再编译。
static const unsigned WIDTH = 16;
static const unsigned VSCALE = 1;
static const unsigned HEIGHT = WIDTH / VSCALE;
static const unsigned FOOTER = 2;
typedef char Row [WIDTH + 1];
typedef Row World [HEIGHT - FOOTER];
std :: vector <World> m_levels;
World levels [] =
{
{
" ",
" ",
" ",
" ",
" ",
" ### ### ",
" ",
"1122112211221122",
" 33003300330033 ",
"1122112211221122",
" 33003300330033 ",
" ",
" ",
" "
},
{
" 44 ",
" 555 55 ",
" 66 66 ",
" 777 777 ",
" 66 66 ",
" 777 777 ",
" 66# #66 ",
" 777 # # 777 ",
" 66 # # 66 ",
" 777 # # 777 ",
" 66# #66 ",
" 555 55 ",
" 44 ",
" "
}
};
// The next line is line 68
m_levels .assign (std :: begin (levels), std :: end (levels));
最后一行错误
.../foo.cpp:68:62:从这里需要 /usr/include/c++/4.9/bits/stl_algobase.h:373:4:错误:静态断言失败:类型不可分配
.../foo.cpp:68:62:从这里需要 /usr/include/c++/4.9/bits/stl_construct.h:75:7:7:错误:数组新中的括号初始值设定项 [-fpermissive]
编译选项没有改变,据我所知,它们-W -Wall -Wextra -Werror -pedantic --std=c++0x
只有 gcc 发生了变化。
为什么这段代码不再编译?
对标准容器的值类型的最低要求是它们必须Erasable
。对于默认分配器,这转化为给定value_type *p;
的要求,p->~value_type();
必须格式正确。
如果 value_type
是类类型,则它仅调用析构函数,如果析构函数未被删除且可访问,则格式正确。如果 value_type
表示标量类型,则 p->~value_type();
也是有效的,并且是无操作(这称为伪析构函数调用)。但是,如果value_type
是数组类型,则p->~value_type();
无效。
因此,内置数组从来都不是标准容器的有效值类型,至少在使用默认分配器时是这样。(其他各种容器操作对值类型提出了更多要求;内置数组至少会与其中一些发生冲突,因为它们不可分配。
实例化具有不满足模板要求的标准库模板会导致未定义的行为。看起来libstdc++碰巧没有诊断出你的错误,直到GCC 4.9附带的版本。
顺便说一下,修复很简单。只需使用std::array
.
过了一段时间,这个线程帮助我弄清楚了这个神秘的错误。我不得不使用的一些遗留代码也停止了编译,我不知道为什么。我没有注意到我在系统升级中更新了编译器版本,新标准导致
stl_algobase.h:364:4: error: static assertion failed: type is not assignable
我的解决方案是强制它使用 03 标准 (--std=c++03) 进行编译,而不是新的默认值。对于那些无法使用适当的std::array
重写大量代码的人来说,我将把它留在这里作为一个简单的解决方案。
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中用vector填充一个简单的动态数组
- vector.resize()中的分配错误
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- 当vector是tje全局变量时,c++中vector的内存管理
- std::vector的包装器,使数组的结构看起来像结构的数组
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- gcc 4.7.0中std::vector::resize()的奇怪行为
- 将std::vector作为模板模板参数传递时出错-在GCC中有效,在MSVC中失败
- 如何解决 gcc 4.7 和 4.9 之间 std::vector 的不同行为
- 我无法再将 char[M][N] 类型分配给 gcc 4.9 上的 std::vector
- GCC 和 VC++ 之间的 std::vector::emplace_back 差异
- 为什么在gcc-4.9.1-4ubuntu2中没有手动输入std::vector
- C++-为什么插入类型的顺序会影响Vector性能(GCC 4.81)