函数取矢量,索引和返回元素

时间:2016-03-08 13:56:13

标签: c++ vector reference

以下工作正常,直到我需要非const引用:

template <typename T>
T const& get(std::vector<T> const& vec, size_t i) { return vec[i]; }

如果我将返回类型更改为T &,则get(vec, 0).push_back(3)之类的内容将起作用(如果vec是整数向量的向量)。但是,如果访问整数向量(而不是向量向量),我们得到:

error: binding ‘const value_type {aka const int}’
to reference of type ‘int&’ discards qualifiers

有没有办法让两者都使用相同的功能?

更新:以下答案中提供的建议有效,但vector<bool>除外。我在这里发布它的详细信息:

 template <typename T>
 T const& get(std::vector<T> const& vec, size_t i) { return vec[i]; }

 template <typename T>
 T & get(std::vector<T> & vec, size_t i) { return vec[i]; }

 int main() {
    std::vector<bool> vec_bool{true,true,false};
    std::cout << get(vec_bool, 0) << std::endl;
 }

使用g++ --std=c++11 test.cc进行编译得出:

 test.cc: In instantiation of ‘T& get(std::vector<T>&, size_t) [with T = bool; size_t = long unsigned int]’:
 test.cc:12:30:   required from here
 test.cc:8:55: error: invalid initialization of non-const reference of type ‘bool&’ from an rvalue of type ‘bool’
  T & get(std::vector<T> & vec, size_t i) { return vec[i]; }
                                                        ^
 In file included from /usr/include/c++/5/vector:65:0,
                  from test.cc:1:
 /usr/include/c++/5/bits/stl_bvector.h:80:5: note:   after user-defined conversion: std::_Bit_reference::operator bool() const
      operator bool() const _GLIBCXX_NOEXCEPT

编译器版本:g ++(Ubuntu 5.3.1-10ubuntu2)5.3.1 20160225

1 个答案:

答案 0 :(得分:1)

std::vectoroperator[],非const和const版本提供two overloads

由于get函数采用const向量,索引向量将始终调用operator[]的const版本,该版本返回const引用。因此,与返回类型不匹配,因为您无法将const int转换为int&,或const vector<vector<...>>转换为vector<vector<...>>&。我想知道在使用矢量矢量时你是怎么没有得到错误的。

您必须提供此功能的两个版本。取一个非const向量并返回一个非const引用,另一个是你已经提供的,它接受一个const向量并返回一个const引用。

这与使用标准operator[]相同,但有一个额外的间接层。

修改:另请参阅此问题 - Is there any difference between “T” and “const T” in template parameter?