c++ - 如何从函数返回 grpc::ClientContext?

标签 c++ move-semantics grpc

我试图通过创建 ClientContext 的函数来避免重复代码。编译以下代码:

template<typename T>
grpc::ClientContext&& context_with_deadline(T duration) {
    grpc::ClientContext context;
    auto deadline = std::chrono::system_clock::now() + duration;
    context.set_deadline(deadline);
    return std::move(context);
}

如果没有将返回类型设为右值引用,或者没有明确的 std::move(我使用的是 C++ 11,所以我相信 RVO 和复制省略不保证),它不会编译。

在其他一些范围内,我现在正在尝试执行此操作,但无法编译:

grpc::ClientContext stream_context = context_with_deadline(std::chrono::milliseconds(3000));

它尝试创建一个临时对象并将其复制到 stream_context 中,这无法完成,因为 ClientContext 的复制构造函数是私有(private)的(未删除)。

有没有什么方法可以不使用 unique_ptr 来做到这一点?如果不是,这可以被认为是一个错误吗? (看来复制构造函数应该被删除,而不是private)。

注意:当我说“不编译”时,这意味着编译器发出了以下内容:

error: ‘grpc::ClientContext::ClientContext(const grpc::ClientContext&)’ is private within this context

最佳答案

复制构造函数是私有(private)的,并且不存在用户定义的 move 构造函数,因此您尝试执行的操作是不可能的。不是从方法返回一个新实例,而是让它引用一个实例:

template<typename T>
void context_with_deadline(grpc::ClientContext& context, T duration) {
    auto deadline = std::chrono::system_clock::now() + duration;
    context.set_deadline(deadline);
}

然后像这样调用它:

grpc::ClientContext stream_context;
context_with_deadline(stream_context, std::chrono::milliseconds(3000));

关于c++ - 如何从函数返回 grpc::ClientContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52455964/

相关文章:

java - 尝试在 java 和 Nodejs 中使用 GRPC 时出现警告 : RPC failed: Status{code=NOT_FOUND, 描述=未找到,原因=null}

c++ - gRPC KeepAlive/空闲超时

events - 来自服务器的 grpc 未经请求的消息?

c++ - boost协程如何在coro_t完成后检索函数返回值

c++ - STL 容器作为模板参数

c++ - 使用互斥锁 move 类的语义

c++ - 在一个普通的可复制结构中, move 语义应该被实现吗?

c++ - 具有称为 main 的全局变量而不是 main 函数的程序如何工作?

c++ - Vista 操作系统中找不到入口点错误

c++ - 我可以在 std::move 之后重新使用像 std::vector 这样的复杂类吗?