GCC 4.8.4 скомпилирует код в порядке. Не каждый компилятор, MSVC++ 14 (VS 2015) не компилируется
LayerData in({rand(),rand(),rand(),rand(),rand()});
Но это скомпилировать
LayerData in{{rand(),rand(),rand(),rand(),rand()}};
Использование C++ 11 Универсальные обозначения
Глядя на причины разрешений GCC это , похоже, потому, что он выделяет тип в стеке, а затем использует XMM для перемещения 32 бит (64 при компиляции по x64) за раз в ячейку памяти. Возможно, это изменяется с размером типа, но обычно я бы сказал, что если вам нужно обеспечить такую же длину, вы не должны подвергать такой тип, как это в любом случае.Обратите внимание, что универсальные обозначения на самом деле могут быть использованы в ваших интересах и с помощью шаблонов вы можете сформировать то, что выглядит очень похожее на то, что вы пытаетесь сделать, и претворяет такое же количество аргументов:
#include <cstdint>
template <int N>
class LayerData
{
static_assert(N > 0, "Number must be greater than 0");
public:
uint32_t d[N];
template<typename... Args>
LayerData(Args&&... args) : d{uint32_t(args)...}
{
static_assert(sizeof...(Args) == N, "Invalid number of constructor arguments.");
}
};
int main()
{
LayerData<4> in1{1, 2, 3, 4}; //Fine
LayerData<60> in2{1, 2, 3, 4}; //Causes error "Invalid number of constructor arguments."
}
наспех, но вы должны получить эту идею.
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.1) – AndresR
8.5.1/4: «Агрегат, который является классом, также может быть инициализирован одним выражением, не заключенным в фигурные скобки». Дело не в том, что длина не проверяется; скорее, ваша инициализация похожа на 'int a [3] = {1};'. –
Хорошо, я просто ожидал 'int a [3] = {1};' также терпеть неудачу. Но в нижеприведенном ответе он указан в стандарте, которого нет. – AndresR