为什么不能使用std :: get()获得向量的成员

Why can std::get() not be used to get members of a vector?

本文关键字:向量 成员 get 不能 std 为什么      更新时间:2023-10-16

我对std::get()函数感到困惑。std::get()可用于访问arraypairtuple中的成员。那么,为什么标准也不允许其访问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
  ^

std::get的索引作为模板参数允许在编译时间检查索引是否有效。只有在编译时间也知道容器的尺寸时,这才有可能。std::vector具有可变大小:您可以在运行时添加或删除元素。这意味着向量的std::get将提供比operator[]at的零好处。