Компиляция с -std = c ++ 03 не обнаружена - PullRequest
1 голос
/ 28 марта 2020

Я собираю этот простой код как g ++ main. cpp -o main -std = c ++ 03

#include <vector>
int main(){
    std::vector<int> array;
    std::vector<int> array2 = { 9, 7, 5, 3, 1 };
}

И я получаю следующую ошибку компиляции:

main. cpp: В функции 'int main ()':
main. cpp: 39: 18: ошибка: в C ++ 98 'массив2' должен быть инициализирован конструктором, а не '{ ...} '
std :: vector array2 = {9, 7, 5, 3, 1};
^ ~~~~~
main. cpp: 39: 43: ошибка: не удалось преобразовать '{9, 7, 5, 3, 1}' из '' в 'std :: vector'
std :: vector array2 = {9, 7, 5, 3, 1};

Кажется, что даже если я компилирую с -std=c++03 (где список инициализации доступно), я все еще использую стандарт C ++ 98. Почему это происходит?

Я знаю, что этот код будет компилироваться с более новыми стандартами.

1 Ответ

5 голосов
/ 28 марта 2020

Почему это происходит?

Поскольку синтаксис доступен только для агрегатной инициализации. std::vector не является агрегатом, поэтому его нельзя инициализировать агрегатом.

В C ++ 11 введена более общая инициализация списка, а также тип std::initializer_list и конструктор для вектора и других контейнеров, которые будут используется с синтаксисом инициализации списка.


Статья, которую вы связали в комментариях, не идеальна:

Представленная в C ++ 03, std :: vector предоставляет .. .

std::vector была введена в самой первой стандартной версии C ++ 98.

std::vector<int> array2 = { 9, 7, 5, 3, 1 }; // use initializer list to initialize array
std::vector<int> array3 { 9, 7, 5, 3, 1 }; // use uniform initialization to initialize array (C++11 onward)

Очень сложно не упомянуть, что первая строка также требует C ++ 11.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...