Почему std :: get() не может использоваться для получения элементов вектора?

Я запутался в функции std::get(). std::get() может использоваться для доступа к элементам в array, pair и tuple. Итак, почему стандарт не позволяет ему получить доступ к элементам в vector?

#include <iostream>
#include <array>
#include <vector>
#include <tuple>
#include <utility> // std::pair
using namespace std;
int main()
{
    array<int, 4> a1{3,4,5,67};
    pair<int,int>  p1{5,6};
    tuple<int,float,float> t1{6,5.5,4.5};

    cout << std::get<1>(a1) <<endl;
    cout << std::get<1>(p1) <<endl;
    cout << std::get<1>(t1) <<endl;
}

Ниже приведен вывод:

4
6
5.5

Но когда я пытаюсь использовать std::get() с vector, я получаю эту ошибку компиляции:

#include <iostream>
#include <array>
#include <vector>
#include <tuple>
#include <utility> // std::pair
using namespace std;
int main()
{
 vector<int> v1{4,5,6,7,9};
 cout << std::get<1>(v1) <<endl;
}

Ошибка компиляции:

  main.cpp: In function 'int main()':
  main.cpp:10:27: error: no matching function for call to 'get(std::vector&)'
  cout << std::get<1>(v1) <<endl;
                       ^
  In file included from main.cpp:2:0:
 /usr/include/c++/5/array:280:5: note: candidate: template constexpr _Tp& 
  std::get(std::array<_Tp, _Nm>&)
  get(array<_Tp, _Nm>& __arr) noexcept
  ^

Ответы

Ответ 1

std::get index является параметром шаблона, который позволяет во время компиляции проверять, является ли индекс действительным. Это возможно только в том случае, если размер контейнера известен и во время компиляции. std::vector имеет переменный размер: вы можете добавлять или удалять элементы во время выполнения. Это означает, что std::get для векторов будет предлагать нулевые преимущества по сравнению с operator[] или at.