如何从函数返回grpc :: ClientContext?

时间:2018-09-22 10:54:25

标签: c++ move-semantics grpc

我试图通过具有创建ClientContexts的功能来避免重复代码。编译以下代码:

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的副本构造函数是私有的(未删除),所以无法完成。

有没有不用unique_ptr来做到这一点的方法?如果不是,是否可以将其视为错误? (似乎应该删除副本构造函数,而不是私有的。)

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

  

错误:“ grpc :: ClientContext :: ClientContext(const grpc :: ClientContext&)”在此上下文中是私有的

2 个答案:

答案 0 :(得分:1)

复制构造函数是私有的,并且不存在用户定义的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));

答案 1 :(得分:0)

不可能。在完成以下操作之前,std::unique_ptr可以解决此问题:

https://github.com/grpc/grpc/issues/16680