将std ::向量作为指针参考

Passing a std::vector as a pointer reference

本文关键字:指针 参考 向量 std      更新时间:2023-10-16

我的函数具有以下签名,我无法更改:

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()))

给出no matching function错误。

这里的主要问题是,如果function对指针进行引用,它可能会修改它,从而导致意外结果。

如果您确定该函数不会修改指针本身,则可以添加过载以简化要完成的操作:

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修改指针时,请谨慎使用。

实时演示

您可能需要此:

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

btw:imo buffer.reserve(10);是没有用的,因为无论如何您都有一个buffer.resize(10);