为什么我的重载<<没有返回任何数据?

rui*_*eco 1 c++ operator-overloading c++11

我有一个类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;
Run Code Online (Sandbox Code Playgroud)

实施:

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;
    }
Run Code Online (Sandbox Code Playgroud)

哪里std::cerr << socket->read_buffer.size() << std::endl;有正确的大小和一步一步的调试显示其内容也是有效的.

但是当我得到数据时:

vector<unsigned char> response;
response << socket;
Run Code Online (Sandbox Code Playgroud)

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

被这困扰了.不应该将return语句复制或移出值吗?

Nat*_*ica 5

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

response << socket;
Run Code Online (Sandbox Code Playgroud)

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

auto foo = response << socket;
Run Code Online (Sandbox Code Playgroud)

但这不是你想要做的.您想要做的就是像对待流对象一样处理左侧cout,并直接操作它.我们这样做的方式是改变签名和一点点的身体operator <<.首先,我们需要通过引用传递向量,因为您要修改它,所以我们有

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

然后我们改变身体从分配矢量socketoutput,然后我们回到输出像

{
    std::cerr << output.size() << std::endl;
    std::cerr << socket->read_buffer.size() << std::endl;
    output = socket->read_buffer;
    return output;
}
Run Code Online (Sandbox Code Playgroud)

真的,虽然我认为只做建筑或分配而不是重载运营商会更好.你可以拥有

vector<unsigned char> response(socket->read_buffer);
// or
vector<unsigned char> response;
// stuff
response = socket->read_buffer;
Run Code Online (Sandbox Code Playgroud)

在您的主要代码中.