【发布时间】:2018-09-22 10:54:25
【问题描述】:
我试图通过创建 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&)”在此上下文中是私有的
【问题讨论】:
-
你能详细说明“不编译”吗?
-
@bipll 完成,谢谢
-
好的,但是如果它是可移动的,你能声明函数返回
grpc::ClientContext,但以return std::move(context);结束吗?命名 RVO 不是必需的,因此您需要给编译器一个提示。 -
@bipll 将函数返回类型声明为
ClientContext而不是ClientContext&&表示该函数无法编译。我猜 RVO 仍然不是必需的,即使有 std::move 提示。 -
究竟是怎么编译不出来的?好的,那么
return ClientContext(std::move(context));
标签: c++ move-semantics grpc