我如何从一个函数中 return a grpc::ClientContext?
How can I return a grpc::ClientContext from a function?
我试图通过创建 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);
}
如果不使 return 类型成为右值引用,或者没有明确的 std::move,它就不会编译(我使用的是 C++ 11,所以我相信 RVO 和复制省略号是不能保证的)。
在其他一些范围内,我现在正在尝试这样做,但无法编译:
grpc::ClientContext stream_context = context_with_deadline(std::chrono::milliseconds(3000));
它尝试创建一个临时对象并将其复制到 stream_context
,这无法完成,因为 ClientContext
的复制构造函数是私有的(未删除)。
有什么方法可以不使用 unique_ptr
来做到这一点吗?如果不是,这可以被认为是一个错误吗? (好像应该删除copy constructor,而不是private)
注意:当我说 "does not compile" 时,表示编译器发出了以下内容:
error: ‘grpc::ClientContext::ClientContext(const grpc::ClientContext&)’ is private within this context
复制构造函数是私有的,并且不存在用户定义的移动构造函数,因此您尝试执行的操作是不可能的。不要从方法返回一个新实例,而是让它引用一个实例:
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));
这不可能。可以使用 std::unique_ptr
解决此问题,直到完成以下操作:
我试图通过创建 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);
}
如果不使 return 类型成为右值引用,或者没有明确的 std::move,它就不会编译(我使用的是 C++ 11,所以我相信 RVO 和复制省略号是不能保证的)。
在其他一些范围内,我现在正在尝试这样做,但无法编译:
grpc::ClientContext stream_context = context_with_deadline(std::chrono::milliseconds(3000));
它尝试创建一个临时对象并将其复制到 stream_context
,这无法完成,因为 ClientContext
的复制构造函数是私有的(未删除)。
有什么方法可以不使用 unique_ptr
来做到这一点吗?如果不是,这可以被认为是一个错误吗? (好像应该删除copy constructor,而不是private)
注意:当我说 "does not compile" 时,表示编译器发出了以下内容:
error: ‘grpc::ClientContext::ClientContext(const grpc::ClientContext&)’ is private within this context
复制构造函数是私有的,并且不存在用户定义的移动构造函数,因此您尝试执行的操作是不可能的。不要从方法返回一个新实例,而是让它引用一个实例:
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));
这不可能。可以使用 std::unique_ptr
解决此问题,直到完成以下操作: