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

标签 c++ c++11 operator-overloading

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

相关文章:

c++ - 与 friend 一起使用父类(super class)的私有(private)变量

类 union 类的 C++11 移动构造函数

c++ - 错误 : cannot call member function impl() of impl_pointer in boost

c++ - 编译错误:使用 constexpr 声明 std::array 大小

c++ - 如何将 GCC 的 printf 格式属性与 C++11 可变参数模板一起使用?

java - 在Java中创建通用有序链表,使用compareTo()时遇到问题

c++ - Cygwin:打开句柄时删除文件

c++ - 如何在不设置值的情况下通知 C++ future?

C++ operator< 重载结构

c++ - 在 C++ 中使用运算符重载添加复数