Инициализация массивов при использовании шаблонов - PullRequest
2 голосов
/ 27 марта 2012

Допустим, у меня есть класс 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 по существу являются константами времени компиляции, поэтому он все равно должен работать одинаково.

Сообщение об ошибке, которое я получаю при компиляции с помощью g ++ (4.5 в ссылке, та же ошибка с 4.6.3):

ошибка: ISO C ++ запрещает инициализацию в массиве new [-fpermissive]

При 4,7 возникает похожая ошибка, хотя и немного другая:

ошибка: инициализатор в скобках в массиве new [-fpermissive]

Проблема также возникает в функциях шаблона, а не только в том случае, когда параметры шаблона используются в фигурных скобках для инициализации, кода и вывода . (спасибо Филипп)

1 Ответ

5 голосов
/ 27 марта 2012

Похоже, это ошибка GCC.Clang принимает его, а стандарт позволяет:

new-initializer:

( expression-list opt )
braced-init-list

И правила для этой инициализации не являются специальными:

A new-expression , создающее объект типа T, инициализирует этот объект следующим образом:

- Если new-initializer опущенобъект инициализированный по умолчанию (8.5);если инициализация не выполняется, объект имеет неопределенное значение.

- В противном случае new-initializer интерпретируется в соответствии с правилами инициализации 8.5 для direct-initialization .

...