使用模板时初始化数组

时间:2012-03-27 17:16:31

标签: c++ class gcc g++ c++11

假设我有班级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本质上是编译时常量,所以它应该仍然有效。

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

  

错误:ISO C ++禁止在数组new [-fpermissive]

中初始化

With 4.7发生了类似的错误,但略有不同:

  

错误:数组new [-fpermissive]

中带括号的初始值设定项

问题也发生在模板函数中,而不仅仅是在用于初始化的大括号code and output中使用模板参数时。 (感谢Philipp)

1 个答案:

答案 0 :(得分:5)

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

  

new-initializer:

     
    

( 表达式列表 opt )
    支撑-INIT列表

  

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

  

创建类型为T的对象的 new-expression 初始化它   对象如下:

     

- 如果省略 new-initializer ,则对象为   默认初始化(8.5);如果没有执行初始化,则   对象具有不确定的价值。

     

- 否则, new-initializer 是   根据8.5的初始化规则解释 direct-initialization