【问题标题】:Initializing arrays when using templates使用模板时初始化数组
【发布时间】:2012-04-11 06:31:18
【问题描述】:

假设我有课程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。 (感谢菲利普)

【问题讨论】:

  • 你是在 C++11 模式下编译吗?
  • ideone.com/h7K7y 有趣。
  • 在这两种情况下我都使用-std=c++0x 进行编译。 Mooing Duck 的结果与我得到的完全一样(我有时看错了 ideone)。
  • 看起来像一个 GCC 错误。标准允许,clang 接受。
  • 可以用更简单的代码来引发这种情况,例如gist.github.com/2220810g++-4.7 -std=c++11 -Wall -Wextra 失败。

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


【解决方案1】:

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

新初始化器:

( 表达式列表opt)
braced-init-list

而且这个初始化的规则并不特别:

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

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

——否则,new-initializer 是 根据 8.5 的初始化规则解释 直接初始化

【讨论】:

  • gcc-4.5.1 在 C++0x 模式下编译(IDEOne)仍然有错误
  • 更可能是 GCC 中的错误:ideone.com/h7K7y .. 我用 gcc-4.6.1 -std=c++0x 编译它,它给出了相同的错误消息。
  • g++ -v 说我正在使用gcc version 4.6.3 (Debian 4.6.3-1)。此外,-std=c++11 未被识别为有效的编译器选项。我正在测试4.7
  • @Mat 很奇怪。我也有 4.6.3(在 Arch 上)并且工作正常(如果您使用 -std=c++0x-std=c++11 仅从 4.7 开始存在)。它在 4.7 中也适用于我。
  • @R.MartinhoFernandes,我已将此报告为错误here,并链接回此问题。我们会看到反应是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多