为什么std :: get()不能用于获取向量的成员?

Alo*_*lok 23 c++ stdvector c++11

我对这个std::get()功能很困惑.std::get()可以用来访问成员array,pairtuple.那么,为什么标准不允许它访问成员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;
}
Run Code Online (Sandbox Code Playgroud)

以下是输出:

4
6
5.5
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

  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
  ^
Run Code Online (Sandbox Code Playgroud)

小智 47

std::get作为模板参数的索引允许它在编译时检查索引是否有效.只有在编译时知道容器的大小时才可以这样做.std::vector具有可变大小:您可以在运行时添加或删除元素.这意味着std::get对于向量将提供零operator[]或以上的益处at.

  • `std :: get`的模板化特性也允许它为不同的索引返回不同的类型(在`pair`和`tuple`中使用),这对于`vector`也不是一个好处. (2认同)
  • @ vu1p3n0x是的,但这对于`std :: array`也没有好处,它确实得到了`std :: get`. (2认同)