c++ - 我不能再将 char[M][N] 类型分配给 gcc 4.9 上的 std::vector

标签 c++ c++11 gcc

在升级 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: required from here /usr/include/c++/4.9/bits/stl_algobase.h:373:4: error: static assertion failed: type is not assignable

.../foo.cpp:68:62: required from here /usr/include/c++/4.9/bits/stl_construct.h:75:7: error: parenthesized initializer in array new [-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

关于c++ - 我不能再将 char[M][N] 类型分配给 gcc 4.9 上的 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27695600/

相关文章:

c++ - 初始化列表中元素的评估顺序

c++ - 在单元测试文件 : 的 Makefile 中包含 gtest 库

c++ - SFML 尝试让 Sprite 跟踪鼠标

c++ - 二维数组如何存储在内存中?

c++ - 我可以拥有非拥有的共享指针吗?

c++ - 我可以获得正式而非实际模板参数的字符串表示形式吗?

c++ - 二维数组中的 Bellman-Ford 算法

c++11 - 如何使用 std::shared_ptr 实现多态性?

C++检查xs :double datatype

c - 针对 x86 架构使用 gcc 编译器的双堆栈对齐问题