gpt4 book ai didi

c++ - 接受 vector 、索引和返回元素的函数

转载 作者:行者123 更新时间:2023-11-28 05:47:50 26 4
gpt4 key购买 nike

以下将正常工作,直到我需要一个非常量引用:

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 是整数 vector 的 vector )。但是,如果访问整数 vector (而不是 vector vector ),我们会得到:

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

最佳答案

std::vector报价two overloads对于 operator[] ,非常量和常量版本。

作为您的 get函数采用 const vector ,索引 vector 将始终调用 operator[] 的 const 版本,它返回一个 const 引用。因此与返回类型不匹配,因为您无法转换 const intint& , 或 const vector<vector<...>>vector<vector<...>>& .我想知道您在使用 vector of vector 时怎么没有出错。

您必须提供此函数的两个版本。一种采用非常量 vector 并返回非常量引用,另一种是您已经提供的采用常量 vector 并返回常量引用。

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

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

关于c++ - 接受 vector 、索引和返回元素的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35869313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com