Необходимость дополнительных скобок в инициализации двумерных массивов в C ++ 11 [duplicate]

Отсутствует «extern» в объявлениях / определениях переменной const (только для C ++)

Для людей, прибывающих с C, может показаться неожиданным, что в C ++ глобальные переменные const имеют внутренние (или статические) связь. В C это не так, поскольку все глобальные переменные неявно extern (т.е. когда отсутствует ключевое слово static).

Пример:

// file1.cpp
const int test = 5;    // in C++ same as "static const int test = 5"
int test2 = 5;

// file2.cpp
extern const int test;
extern int test2;

void foo()
{
 int x = test;   // linker error in C++ , no error in C
 int y = test2;  // no problem
}

correct would использовать файл заголовка и включить его в file2.cpp и file1.cpp

extern const int test;
extern int test2;

. В качестве альтернативы можно было бы объявить переменную const в файле file1.cpp с явным extern

11
задан bstamour 13 September 2013 в 19:34
поделиться

1 ответ

На самом деле вы также можете написать следующее в C ++ 11:

std::array<int, 3> arr{1,2,3};

Это вполне допустимый синтаксис.

Что не разрешено в C ++ 11, хотя это что-то вроде этого случая (см. эту тему, я не хочу писать это здесь еще раз, это длинный пост) . Поэтому, если вы спросите, что тогда да, мы можем опустить дополнительные фигурные скобки в C ++ 14. Это предложение:

  • Унифицированная инициализация для массивов и агрегатных типов классов
  • Введение говорит, что в этом документе предлагается небольшая релаксация правил для выравнивающие фигурные скобки из агрегатной инициализации, чтобы сделать инициализацию массивов и агрегатов классов более однородными. Это изменение требуется для поддержки типов агрегатов классов с одной совокупностью элементов, которые ведут себя аналогично их аналогам массивов (т. Е. std::array).

Надеюсь, что это поможет.

15
ответ дан Community 24 August 2018 в 16:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: