使用模板时初始化数组

Mat*_*att 2 c++ gcc g++ class c++11

假设我上课了Foo.以下工作正常:

class Foo
{
    public:
        const int* bar;

        Foo()
        {
            bar = new int[2] {1, 2};
        }
};
Run Code Online (Sandbox Code Playgroud)

但是,我尝试稍微改变一下以使用模板:

template<int A, int B>
class Foo
{
    public:
        const int* bar;

        Foo()
        {
            bar = new int[2] {A, B};
        }
};
Run Code Online (Sandbox Code Playgroud)

我的方法模板工作的理解是,AB基本上编译时间常数,所以它应该仍然工作一样.

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

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

使用4.7时会出现类似的错误,但略有不同:

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

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

R. *_*des 5

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

新初始化:

( expression-list opt)
braced-init-list

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

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

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

- 否则,根据8.5的初始化规则解释new-initializer以进行直接初始化.