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

时间:2018-02-15 09:45:34

标签: c++

我有一个具有以下签名的功能,我无法更改:

bool function(uint8_t*& data, uint32_t size)

我想传递一个标准向量,我能够按如下方式进行:

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错误。

2 个答案:

答案 0 :(得分:3)

这里的主要问题是,如果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修改了指针,请谨慎使用。

Live demo

答案 1 :(得分: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

顺便说一句:IMO buffer.reserve(10);没用,因为你之后还有buffer.resize(10);