Когда я пытаюсь скомпилировать
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]
,
Кто-нибудь, пожалуйста, пролите немного света на это не интуитивное поведение.
Конструкция (int[2]){0}
является составным литералом C99, который не является частью C ++. То, как определенные компиляторы интерпретируют в контексте C ++, является чьим-либо предположением (или вопросом изучения исходного кода).
PS. Хорошо, похоже, что gcc 4.7 / gcc 4.8 / clang-3.1 справляются с этим довольно разумно — тип составного литерала такой же, как его определяет стандарт C99.
Я думаю, что OP-компилятор немного старше.
Других решений пока нет …