将std::vector作为指针引用传递

5
我是您的有益助手,以下是您需要翻译的内容:

我有一个函数,其签名如下所示,我无法更改:

bool function(uint8_t*& data, uint32_t size)

我想传递一个std向量,我可以这样做:

std::vector<uint8_t> buffer;
buffer.reserve(10);
buffer.resize(10);

uint8_t* data = &buffer[0];
function(data, buffer.size()))

有没有办法避免创建data指针?以下代码无法编译:

function(&buffer[0], buffer.size()))

会报“无匹配函数”错误。


9
你需要弄清楚这个函数为什么要接受一个指针的引用作为参数。 - juanchopanza
@juanchopanza 哈哈哈哈 公司的代码超出了我的权限范围,无权访问源代码。我知道这很愚蠢,但我认为它是错误的,却无法改变它。 - Blasco
4
没关系。大概它想要设置一个你传递给它的指针。但你不想让&data[0]指向其他地方。 - juanchopanza
2
@juanchopanza 我想你解决了它。它是指向指针的引用,任何通过非const左值引用传递的东西都不能是临时值(即必须有一个变量,将其分配给您的值,然后传递它)。在你的情况下:uint8_t* pass = &buffer[0];,然后function(pass, buffer.size())) - user9335240
2
@WooWapDaBug,这里想表达的意思是该函数可能会改变数据的值;这意味着虽然它现在可能有效,但最终你可能会得到数据被写入到向量之外并以新指针返回的情况... - UKMonkey
显示剩余11条评论
2个回答

3

这里的主要问题在于,如果函数接受一个指针的引用,它可能会修改它而导致意外的结果。

如果您确定该函数不会修改指针本身,您可以添加一个重载函数以简化您想要实现的内容:

bool function(uint8_t*& data, uint32_t size) {
    return false;
}

// overloaded on rvalue reference to pointer
bool function(uint8_t*&& data, uint32_t size) { 
    return function(data, size);
}

int main() {
    std::vector<uint8_t> buffer;
    buffer.reserve(10);
    buffer.resize(10);
    function(buffer.data(), buffer.size());
}

请注意这是危险的,特别是如果function修改指针,因此请小心使用。

实时演示


我怎么知道它是否修改了指针?我认为它没有,因为std::vector在之后仍然可以工作,并且我可以使用for(auto e : buffer)循环遍历它。这是一个好迹象,表明它可能没有修改指针吗?还是无关的?感谢您的解决方案,它非常棒。 - Blasco
2
如果您无法访问源代码或文档,则无法真正了解。编写广泛的测试可能会有所帮助。 - amc176

2
您可能需要这个:
uint8_t* data = buffer.data();   // data will point to the first element of the vector
function(data, buffer.size());
// function may have modified the data pointer at this point

现在我很想知道 function 到底是做什么的,特别是它是否修改了 data
顺便说一下,我认为 buffer.reserve(10); 是无用的,因为你之后又有一个 buffer.resize(10);

我也很感兴趣,但无法访问源代码...它基本上接收一个TCP消息并将内容放入该缓冲区。 - Blasco
如果您无法访问源代码,至少应该能够访问一些文档。 - Jabberwocky
文档是头文件,它有我发布的签名... 哈哈哈不要坚持,否则你会让我哭的,就像我所说的那样。 - Blasco
1
你所在的公司很奇怪,我希望这里提供的答案能够有所帮助。 - Jabberwocky
他们非常有帮助,我学到了关于std::vector::data()的知识。我之前一直在写&v[0],所以很高兴我问了他们。 - Blasco
1
顺便提一下:如果向量为空,vector::data 将返回 nullptr - Jabberwocky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接