gpt4 book ai didi

c++ - 为什么我的重载 << 不返回任何数据?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:25:13 25 4
gpt4 key购买 nike

我有一个加载 vector<unsigned char> 的类使用 Asio 的异步方法。然后,我重载了 << 运算符以返回该数据。

问题是即使缓冲区已满且有效,运算符也不会返回任何数据。

我的缓冲区:vector<unsigned char>read_buffer;

运算符声明:

friend std::vector<unsigned char> operator<<(const vector<unsigned char>output, const shared_ptr<Socket>socket) noexcept;

实现:

std::vector<unsigned char> operator<<(const vector<unsigned char>output,
const shared_ptr<Socket>socket) noexcept {
std::cerr << output.size() << std::endl;
std::cerr << socket->read_buffer.size() << std::endl;
return socket->read_buffer;
}

哪里std::cerr << socket->read_buffer.size() << std::endl;大小合适,一步步调试显示内容也是有效的。

但是当我取回数据时:

vector<unsigned char> response;
response << socket;

response是空的。我已尝试将其初始化为预期响应的长度,但我最终得到了一个包含 X 个空字符的缓冲区。

被这个难住了。返回语句不应该复制或移出值吗?

最佳答案

你对正在发生的事情有一个错误的假设

response << socket;

当您执行上述操作时,返回 operator <<未分配到 response .相反,响应是运算符的左侧,套接字是右侧,因为它是二元运算符。返回值本身将被捕获做类似的事情

auto foo = response << socket;

但这不是你想要做的。你想要做的是像对待 cout 这样的流对象一样对待左侧。并直接操纵它。我们这样做的方法是更改​​ operator << 的签名和一点正文。 .首先我们需要通过引用传递 vector ,因为你想修改它所以我们有

std::vector<unsigned char>& operator<<(const vector<unsigned char>& output,
const shared_ptr<Socket>socket) noexcept
^ lvalue references here ^

然后我们更改正文以分配来自 socket 的 vector 进入output然后我们返回类似的输出

{
std::cerr << output.size() << std::endl;
std::cerr << socket->read_buffer.size() << std::endl;
output = socket->read_buffer;
return output;
}

虽然我认为只进行构造或赋值而不是重载运算符会更好。你可以拥有

vector<unsigned char> response(socket->read_buffer);
// or
vector<unsigned char> response;
// stuff
response = socket->read_buffer;

在你的主代码中。

关于c++ - 为什么我的重载 << 不返回任何数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40261352/

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