假设我有班级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};
}
};
我对模板工作方式的理解是A
和B
本质上是编译时常量,所以它应该仍然有效。
编译with g++时得到的错误消息(链接中的4.5,与4.6.3相同的错误)是:
错误:ISO C ++禁止在数组new [-fpermissive]
中初始化
With 4.7发生了类似的错误,但略有不同:
错误:数组new [-fpermissive]
中带括号的初始值设定项
问题也发生在模板函数中,而不仅仅是在用于初始化的大括号code and output中使用模板参数时。 (感谢Philipp)
答案 0 :(得分:5)
看起来这是一个GCC错误。 Clang接受了它,标准允许它:
new-initializer:
(
表达式列表 opt)
支撑-INIT列表
这种初始化的规则并不特别:
创建类型为
T
的对象的 new-expression 初始化它 对象如下:- 如果省略 new-initializer ,则对象为 默认初始化(8.5);如果没有执行初始化,则 对象具有不确定的价值。
- 否则, new-initializer 是 根据8.5的初始化规则解释 direct-initialization 。