假设我有课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
and B
本质上是编译时常量,因此它应该仍然可以正常工作。
我在编译时收到的错误消息with g++ http://ideone.com/h7K7y(链接中的 4.5,与 4.6.3 相同的错误)是:
错误:ISO C++ 禁止在数组 new 中初始化 [-fpermissive]
With 4.7 http://pastie.org/3679616会发生类似的错误,但略有不同:
错误:数组 new [-fpermissive] 中带括号的初始值设定项
该问题也出现在模板函数中,而不仅仅是在大括号内使用模板参数进行初始化时,代码和输出 https://gist.github.com/2220810。 (感谢菲利普)
看起来这是一个 GCC 错误。 Clang 接受它,并且标准允许它:
新的初始化器:
(
expression-listopt)
braced-init-list
并且这个初始化的规则并不特殊:
A 新表达创建一个类型的对象T
初始化
对象如下:
— 如果新的初始化器被省略,对象是默认初始化(8.5);如果没有执行初始化,则
对象具有不确定的值。
— 否则,新的初始化器是
根据8.5的初始化规则解释为直接初始化.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)