以下工作正常,直到我需要非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
答案 0 :(得分:1)
std::vector
为operator[]
,非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?