使用模板时正在初始化数组

Initializing arrays when using templates

本文关键字:初始化 数组      更新时间:2023-10-16

假设我有类Foo。以下操作很好:

class Foo
{
    public:
        const int* bar;
        Foo()
        {
            bar = new int[2] {1, 2};
        }
};

然而,我试着稍微改变一下,使用一个模板:

template<int A, int B>
class Foo
{
    public:
        const int* bar;
        Foo()
        {
            bar = new int[2] {A, B};
        }
};

我对模板工作方式的理解是,AB本质上是编译时间常数,所以它应该仍然工作不变。

我用g++编译时得到的错误消息(链接中的4.5,与4.6.3相同的错误)是:

错误:ISO C++禁止在数组中初始化新的[-fpermission]

对于4.7,会出现类似的错误,尽管略有不同:

错误:数组new[-fpermission]中带括号的初始值设定项

这个问题也发生在模板函数中,而不仅仅是在初始化、代码和输出的大括号中使用模板参数时。(感谢Philipp)

看起来这是一个GCC错误。Clang接受它,标准允许它:

新初始值设定项:

(表达式列表opt)
支持的初始列表

这种初始化的规则并不特殊:

创建T类型对象的新表达式初始化对象如下:

--如果省略了新初始值设定项,则对象为默认初始化(8.5);如果没有执行初始化对象的值不确定。

--否则,新初始值设定项为根据8.5的初始化规则对直接初始化进行解释。