Сбой компиляции при передаче массива с отсутствующими инициализаторами в качестве аргумента

Когда я пытаюсь скомпилировать

template<int dim>
struct Foo
{
Foo(const int (&i)[dim]) {}
};

int main()
{
Foo<2> f = Foo<2>((int[2]){0});  // line 9
return 0;
}

Я получаю ошибку компиляции

test.cpp: 9: 31: ошибка: нет подходящей функции для вызова ‘Foo<2> :: Foo (int [1]) ’

По-видимому, аргумент, который я передаю конструктору, рассматривается как int[1], Почему это не считается int[2] (который затем может быть приведен к константной ссылке, как ожидалось конструктором)? Разве недостающие элементы не должны быть инициализированы в соответствии с 8.5.1 (7)?

В конце концов, замена строки 9 на

int arg[2] = {0};
Foo<2> f = Foo<2>(arg);

Позвольте мне скомпилировать программу. Кроме того, когда я пытаюсь пройти (const int [2]){0, 0, 0} в конструктор я получаю сообщение об ошибке слишком много инициализаторов для «const int [2]», так видимо, компилятор является пытаясь построить const int[2],

Кто-нибудь, пожалуйста, пролите немного света на это не интуитивное поведение.

1

Решение

Конструкция (int[2]){0} является составным литералом C99, который не является частью C ++. То, как определенные компиляторы интерпретируют в контексте C ++, является чьим-либо предположением (или вопросом изучения исходного кода).

PS. Хорошо, похоже, что gcc 4.7 / gcc 4.8 / clang-3.1 справляются с этим довольно разумно — тип составного литерала такой же, как его определяет стандарт C99.

Я думаю, что OP-компилятор немного старше.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector