我有一个加载 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/