void fn(const vector<const char*>)
由于函数类型的顶级const
限定符被删除,这(在调用站点)相当于:
void fn(vector<const char*>)
两者都请求传递的向量的副本,因为标准库容器遵循值语义。
您可以:
- 通过调用它
fn({vc.begin(), vc.end()})
,请求显式转换
- 将签名更改为,例如
void fn(vector<const char*> const&)
,即参考
如果您可以修改 的签名fn
,则可以遵循GManNickG的建议并使用迭代器/ 范围代替:
#include <iostream>
template<typename ConstRaIt>
void fn(ConstRaIt begin, ConstRaIt end)
{
for(; begin != end; ++begin)
{
std::cout << *begin << std::endl;
}
}
#include <vector>
int main()
{
char arr[] = "hello world";
std::vector<char *> vc;
for(char& c : arr) vc.push_back(&c);
fn(begin(vc), end(vc));
}
这给出了漂亮的输出
你好世界
你好世界
世界
世界
世界
世界
世界
世界
rld
ld
d
基本问题是传递标准库容器。如果您只需要不断地访问数据,则不需要知道实际的容器类型,而可以使用模板来代替。这消除了fn
与调用者使用的容器类型的耦合。
正如您所注意到的,允许std::vector<T*>
通过 a访问 a 是一个坏主意std::vector<const T*>&
。但是如果你不需要修改容器,你可以使用一个范围来代替。
如果该函数fn
不应或不能是模板,您仍然可以传递范围const char*
而不是向量const char
。这将适用于任何保证连续存储的容器,例如原始数组、std::array
s、std::vector
s 和std::string
s。