Первый пример автоматически узнает его размер по элементам, которыми он инициализирован. Второй пример требует, чтобы вы явно определяли длину массива (чтобы он работал). Почему это так? Есть ли в этом причина?

Инициализация массива вне класса / структуры / ...

const int intArray[] = { 0, 1, 2 };

struct Example
{
    int SizeOfArray()
    {
        return sizeof(intArray);
    }
};

Инициализация массива внутри класса / структуры / ...

Сбой

struct Example
{
    const int intArray[] = { 0, 1, 2 };

    int SizeOfArray()
    {
        return sizeof(intArray);
    }
};

Ошибка: невозможно указать явный инициализатор для массивов

Решение

struct Example
{
    const int intArray[3] = { 0, 1, 2 };

    int SizeOfArray()
    {
        return sizeof(intArray);
    }
};
1
Steve Van Opstal 29 Дек 2013 в 15:23
1
Я не уверена. Но, вероятно, это связано с этим: когда вы определяете единственный массив, вы определили весь объект. Когда массив является членом класса, тип не является полным, и компилятор не может выделить необходимое хранилище. Определение класса завершается на последнем }; класса.
 – 
harper
29 Дек 2013 в 16:12
Инициализация вашего массива в классе действительно должна указывать длину, но не должна заключать ее в std::array: вы можете записать ее как const int intArray[3] = { 0, 1, 2 };
 – 
user743382
29 Дек 2013 в 17:57
Уверены ли вы? Сначала у меня было ваше решение, но затем я изменил его на std::array, потому что при компиляции я получил ту же ошибку, что и в примере с ошибкой: невозможно указать явный инициализатор для массивов
 – 
Steve Van Opstal
29 Дек 2013 в 18:03
1
Да, в стандартном C ++ можно. Тот факт, что Visual Studio отклоняет это, является ошибкой. (Примечание: синтаксис здесь другой, но проблема та же.)
 – 
user743382
29 Дек 2013 в 18:06
На самом деле это не меняет проблемы, но это полезно знать. Я вернул его к своему исходному сообщению. Еще одна причина перейти на другую IDE.
 – 
Steve Van Opstal
29 Дек 2013 в 18:10

1 ответ

Лучший ответ

Я думаю, это потому, что инициализация класса / структуры - это просто синтаксический сахар для записи части списка инициализаторов в другом месте. В соответствии с этим ваш ошибочный пример равен следующему:

struct Example
{
    const int intArray[];

    Example() :
       // start of compiler-generated pseudo code
       intArray[0](0),
       intArray[1](1),
       intArray[2](2)
       // end of compiler-generated pseudo code
    {
    }

    int SizeOfArray()
    {
       return sizeof(intArray);
    }
};

Приведенный выше код, очевидно, определяет неполную структуру неизвестного размера, как сказал @harper в своем комментарии.

P.S. Не удалось найти доказательства в стандарте, но я почти уверен, что он охватывает этот случай, вероятно, неявно.

3
Steve Van Opstal 29 Дек 2013 в 17:33